【问题标题】:Parse a string from a sensor containing 3 floats从包含 3 个浮点数的传感器解析字符串
【发布时间】:2014-10-13 11:21:53
【问题描述】:

我正在尝试解析来自温度传感器的信息。 传感器发送一个格式如下的字符串:

Temp: 1   388  2   358  3   200?    
Temp: 1   388  2   200?  3   200?  

(第一个字符串包含有效的通道 2 样本和断开的通道 3,第二个字符串的通道 2 和 3 断开)。

我需要解析那些“dat”,它是一个没有点的浮点数,我不能使用 String.split() 因为如果传感器没有检测到任何东西,它会添加一个“?”到“dat”的结尾。 输出应该是:

Temp[0]= 38.8
Temp[1]= 35.8
Temp[2]= 20.0

我还需要解析那个 '?'表示频道是否已断开连接。

【问题讨论】:

  • 我很少听到像这个问题那样大声要求正则表达式的问题...到目前为止您尝试过什么?
  • 如果您提供 actual 示例数据而不是带有“dat”的行,这将有所帮助。目前尚不清楚为什么拆分对您不起作用...
  • 你能提供一些真实的样品吗?
  • 用真实数据更新

标签: java sensors temperature


【解决方案1】:

我尝试使用 split() 来解决这个问题,并没有看到你说的任何错误。

public static void parseData(String data) {
    String[] args = data.split("\\s+");
    for (int i=2; i<7; i+=2) {
        if (args[i].charAt(args[i].length() - 1) == '?') {
            args[i] = args[i].substring(0, args[i].length() - 1);
        }
        double val = Double.parseDouble(args[i]) / 10;
        System.out.println("Temp[" + (i-1)/2 + "]= " + val);
    }
}

【讨论】:

  • 谢谢,我忘了在 Split 中加一个“+”,这就是我不使用 String.split() 的原因。和你的 '?'识别很棒!
【解决方案2】:

可能最简单的方法是使用String.split("\\s"),这将提供一个字符串数组。例如:

 Temp: 1   388  2   358  3   200?  => {"Temp:", "1", "388", "2", "358", "3", "200?"}

知道第一个温度应该是第三列,您可以从那里开始处理。要获取数值,您可以使用Integer.parse(...)。对于浮点数,您可以除以 10。您可以检查它是否有尾随“?”与String.endsWith(...)。对于更复杂的处理,您可以使用不同的正则表达式。更多信息 herehere 关于 java 中的正则表达式。

您如何收到您的意见?你从哪里读到的? scanner 是一个好的简单的解决方案。

【讨论】:

    【解决方案3】:

    给你:

    Scanner line = new Scanner(sensorStream);
    while (line.hasNext()) {
        line.next(); // Temp:
        line.next(); // #
    
        int firstReading = line.nextInt(); // 388
        float realFirstReading = firstReading/10.0; // 38.8
    
        line.next(); // #
        int secondReading = line.nextInt(); // 358
        float realSecondReading = secondReading/10.0 // 35.8
    
        line.next(); // #
        int thirdReading = line.nextInt(); // 200
        float realThirdReading = thirdReading / 10.0; // 20.0
        // do what you will with it
    }
    

    如果您需要进一步的帮助,请发表评论...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多