2013-06-21 66 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