2013-06-21 94 views
0

我收到一個數據包如Java中高效的字符串讀取?

"c~ ¹" M:0013A20040559361 Ax:48 Ay:10 Az:1012 Tp:25 B:45 ? Tm:Wednesday, 02/01/13 - 16:16.57 Sº~"

其他字符,無法粘貼。我必須閱讀冒號後的值。例如,M: , Ax:, Ay:並將其存儲或繪製在圖形中。我知道兩種方式:StreamTokenizer或簡單的Java邏輯。問題是我已經嘗試了兩種方法,但在閱讀值時仍然收到太多錯誤。另外,我嘗試了一個字符串垃圾收集器,它不工作。

下面是代碼爲兩個:

if(message2.contains("Ax:")) 
    { 
    int index = message2.indexOf("Ax:"); 
    String Ax = message2.substring(index+3); 
    ChartAcceleration.tsAx.addOrUpdate(new Millisecond(), Double.valueOf(Ax)); 
    } 

StreamTokenizer Code: 

StreamTokenizer st = new StreamTokenizer(
       new StringReader(message)); 

     boolean eof = false; 
     while(st.nextToken() != StreamTokenizer.TT_EOF){ 

       int token = st.nextToken(); 
       switch (token) { 
       case StreamTokenizer.TT_WORD: 
        String word = st.sval; 
        if(word.contains("Ax")) 
        { 
         Ax = true; 
        } 
        else 
         if(word.contains("Ay")) 
        { 
         Ay = true; 
        } 
         else 
          if(word.contains("Az")) 
         { 
          Az = true; 
         } 
          else 
           if(word.contains("P")) 
          { 
           P = true; 

          } 
           else 
            if(word.contains("B")) 
           { 
            B = true; 
           } 
            else 
             if(word.contains("Tp")) 
            { 
             Tp = true; 
             } 
             else 
             { 
              Ax = false; 
              Ay = false; 
              Az = false; 
              P = false; 
              B = false; 
              Tp = false; 
             } 
       // System.out.println("Word: " + word); 
        break; 
       case StreamTokenizer.TT_NUMBER: 
        double number = st.nval; 
        if(Ax) 
        { 
         Ax = false; 
        // errorChecker(AxStr,number); 
         AxStr = number; 
         Sender.publishAccelerator("Ax:" + String.valueOf(AxStr)); 
        } 
        else 
         if(Ay) 
         { 
          Ay = false; 
          AyStr = number; 
          Sender.publishAccelerator("Ay:"+String.valueOf(AyStr)); 
         } 
         else if(Az) 
         { 
          Az = false; 
          AzStr = number; 
          Sender.publishAccelerator("Az:"+String.valueOf(AzStr)); 
          // System.out.println("Az:"+AzStr); 

         } 
         else 
          if(P) 
           { 
            P = false; 
            PStr = number; 
            Sender.publishPressure(String.valueOf(PStr)); 
            //System.out.println("P:"+PStr); 

           } 
           else 
            if(B) 
            { 
             B = false; 
             BStr = number; 
             Sender.publishBattery(String.valueOf(BStr)); 
            } 
            else 
             if(Tp) 
             { 
              Tp = false; 
              TpStr = number; 
              Sender.publishTemp(String.valueOf(TpStr)); 
             } 
        break; 

       default: 
       } 
     } 
+0

你不能使用REGEX有2個組,一個返回什麼是betfore':',第二個組返回值? –

+1

什麼是「字符串垃圾收集器」? –

+0

你確定你沒有字符編碼的問題嗎?你會得到什麼樣的「錯誤」? – Flavio

回答

1

我把一個字符串解析程序爲您的文本。

您可以定義要解析的標記和結束標記。

這是我的結果。

Ay: 10 
Az: 1012 
Tp: 25 
B: 45 
Ax: 48 
Tm: Wednesday, 02/01/13 - 16:16.57 

這裏是解析代碼。

import java.util.Iterator; 
import java.util.Properties; 
import java.util.Set; 

public class StringParsing { 

    private String[][] tokens = { {"Ax:", " "}, 
      {"Ay:", " "}, {"Az:", " "}, {"Tp:", " "}, {"B:", " "}, 
      {"Tm:", " Sº"} }; 

    public Properties parseString(String s) { 
     Properties p = new Properties(); 

     for (int i = 0; i < tokens.length; i++) { 
      String value = getValue(s, tokens[i][0], tokens[i][1]); 
      p.setProperty(tokens[i][0], value); 
     } 
     return p; 
    } 

    private String getValue(String s, String token, String endToken) { 
     int sPos = s.indexOf(token); 
     if (sPos >= 0) { 
      int ePos = s.indexOf(endToken, sPos + 1); 
      if (ePos > sPos) { 
       sPos += token.length(); 
       return s.substring(sPos, ePos); 
      } 
     } 
     return ""; 
    } 


    public static void main(String[] args) { 
     String s = "c~ ¹\" M:0013A20040559361 Ax:48 Ay:10 Az:1012 " + 
       "Tp:25 B:45 ? Tm:Wednesday, 02/01/13 - 16:16.57 Sº~"; 

     StringParsing parsing = new StringParsing(); 
     Properties p = parsing.parseString(s); 

     Set<Object> keys = p.keySet(); 
     Iterator<Object> iter = keys.iterator(); 

     while(iter.hasNext()) { 
      String key = (String) iter.next(); 
      String value = p.getProperty(key); 
      System.out.println(key + " " + value); 
     } 
    } 

} 

編輯添加代碼以迴應評論。

我還沒有測試過這個,因爲我沒有你的數據文件,但這裏是你如何加載地圖。重要的是,您必須爲每個Map條目創建一個新的Properties對象,因爲該映射包含一個指向Properties對象的指針。

public void processStrings() { 
     Map<String, Properties> dataMap = new TreeMap<String, Properties>(); 
     StringParsing parsing = new StringParsing(); 
     try { 
      BufferedReader reader = new BufferedReader(new FileReader(
        "dataFile.txt")); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       Properties p = parsing.parseString(line); 
       dataMap.put(p.getProperty("M:"), p); 
      } 
      reader.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

謝謝。那時我的工作效率更高。 – Kamran

+0

我在這裏面臨一個問題。我現在正在閱讀不同的設備,這些設備具有不同的M值(MAC),然後使用一個密鑰將每個MAC存儲在HashMap中,然後將這些數據發送到圖形,撥號等... HashMap中。問題是數據混合,就像錯誤的鍵被附加到數據。任何建議我怎麼能過來呢?謝謝! – Kamran

+0

您也可以看到該代碼稍後生成Ax,但它之前出現在字符串中。 – Kamran