我有一个看起来像这样的文本文件:


  ABC = -1 Temp = 2 Try = 34 Message =“ some text” SYS = 3
  ABC = -1温度= 5尝试= 40消息=“更多和不同的文本” SYS = 6


并且模式继续,但仅更改了“”内的数字值和文本。

注意:Message =也可以有多个引号。

我想将ABC,Temp,Try和SYS的值存储到int变量中
和消息到一个字符串变量。

我目前正在使用:

Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
  String line = scanner.nextLine();
  int count = line.indexOf("ABC=");
  if (count >= 0) {
    int clear = line.charAt(count + 3);
  }
}
scanner.close();


我曾考虑过使用Scanner类并逐行读取,但对于如何将行分类为不同的变量感到困惑。

最佳答案

首先创建一个代表数据的类:

public static class MyData { // please pick a better name
    final int abc;
    final int temp;
    final int tryNumber; // try is a keyword
    final String message;
    final int sys;

    public MyData(int abc, int temp, int tryNumber, String message, int sys) {
      this.abc = abc;
      this.temp = temp;
      this.tryNumber = tryNumber;
      this.message = message;
      this.sys = sys;
    }
}


然后创建一个使用Regex capture groupsString转换为此类的方法:

private static Pattern p =
  Pattern.compile("ABC=([^ ]+) Temp=([^ ]+) Try=([^ ]+) Message=\"(.+)\" SYS=([^ ]+)");

private static MyData makeData(String input) {
  int abc = 0, temp = 0, tryNumber = 0, sys = 0;
  String message = "";

  Matcher m = p.matcher(input);
  if (!(m.find()) return null;
  abc = Integer.parseInt(m.group(1));
  temp = Integer.parseInt(m.group(2));
  tryNumber = Integer.parseInt(m.group(3));
  message = m.group(4);
  sys = Integer.parseInt(m.group(5));

  return new MyData(abc, temp, tryNumber, message, sys);
}


然后使用扫描仪读取文件:

public static void main (String... args) throws Exception {
    File file = new File("/path/to/your/file.txt");
    List<MyData> dataList = new ArrayList<>();

    Scanner scanner = new Scanner(file);
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        MyData data = makeData(line);
        if(data != null) dataList.add(data);
    }
    scanner.close();
}


Here's a completely working demo on ideone

10-08 08:48
查看更多