Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将文件内容解析为变量?_Java_Parsing_File Io - Fatal编程技术网

Java 如何将文件内容解析为变量?

Java 如何将文件内容解析为变量?,java,parsing,file-io,Java,Parsing,File Io,我的文本文件如下所示: ABC=-1 Temp=2 Try=34 Message=“some text”SYS=3 ABC=-1 Temp=5 Try=40 Message=“更多和不同的文本”SYS=6 模式继续,但仅更改“”中的数值和文本 注意:消息=也可以有多个引号 我想将ABC、Temp、Try和SYS的值存储到int变量中 和消息到字符串变量 我目前正在使用: Scanner scanner = new Scanner(file); while (scanner.hasNextLine

我的文本文件如下所示:

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

模式继续,但仅更改“”中的数值和文本

注意消息=也可以有多个引号

我想将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;
    }
}
然后使用以下方法将
字符串
转换为此类:

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

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();
}
publicstaticvoidmain(String…args)引发异常{
File File=新文件(“/path/to/your/File.txt”);
List dataList=new ArrayList();
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
MyData data=makeData(行);
if(data!=null)dataList.add(data);
}
scanner.close();
}

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

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;
    }
}
然后使用以下方法将
字符串
转换为此类:

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

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();
}
publicstaticvoidmain(String…args)引发异常{
File File=新文件(“/path/to/your/File.txt”);
List dataList=new ArrayList();
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
MyData data=makeData(行);
if(data!=null)dataList.add(data);
}
scanner.close();
}

如果您已经在使用
indexOf
方法,下面的代码将起作用

    String a = "ABC=-1 Temp=2 Try=34 Message=\"some text\" SYS=3";
    int abc_index = a.indexOf("ABC");
    int temp_index = a.indexOf("Temp");
    int try_index = a.indexOf("Try");
    int message_index = a.indexOf("Message");
    int sys_index = a.indexOf("SYS");
    int length = a.length();

    int abc = Integer.parseInt(a.substring(abc_index + 4, temp_index - 1));
    int temp = Integer.parseInt(a.substring(temp_index + 5, try_index - 1));
    int try_ = Integer.parseInt(a.substring(try_index + 4, message_index - 1));
    String message = a.substring(message_index + 9, sys_index - 2);
    int sys = Integer.parseInt(a.substring(sys_index + 4, length));

    System.out.println("abc : " + abc);
    System.out.println("temp : " + temp);
    System.out.println("try : " + try_);
    System.out.println("message : " + message);
    System.out.println("sys : " + sys);
这将为您提供以下信息

abc : -1
temp : 2
try : 34
message : some text
sys : 3

仅当您获取的字符串数据具有此确切语法时,这才有效,即它包含
ABC
Temp
Try
Message
SYS
。希望这能有所帮助。

如果您已经在使用
indexOf
方法,下面的代码将起作用

    String a = "ABC=-1 Temp=2 Try=34 Message=\"some text\" SYS=3";
    int abc_index = a.indexOf("ABC");
    int temp_index = a.indexOf("Temp");
    int try_index = a.indexOf("Try");
    int message_index = a.indexOf("Message");
    int sys_index = a.indexOf("SYS");
    int length = a.length();

    int abc = Integer.parseInt(a.substring(abc_index + 4, temp_index - 1));
    int temp = Integer.parseInt(a.substring(temp_index + 5, try_index - 1));
    int try_ = Integer.parseInt(a.substring(try_index + 4, message_index - 1));
    String message = a.substring(message_index + 9, sys_index - 2);
    int sys = Integer.parseInt(a.substring(sys_index + 4, length));

    System.out.println("abc : " + abc);
    System.out.println("temp : " + temp);
    System.out.println("try : " + try_);
    System.out.println("message : " + message);
    System.out.println("sys : " + sys);
这将为您提供以下信息

abc : -1
temp : 2
try : 34
message : some text
sys : 3

仅当您获取的字符串数据具有此确切语法时,这才有效,即它包含
ABC
Temp
Try
Message
SYS
。希望这能有所帮助。

您可以使用
regex
进行此类解析,其模式为:

"ABC=([+-]?\\d+) Temp=([+-]?\\d+) Try=([+-]?\\d+) Message=\"(.+)\" SYS=([+-]?\\d+)"
模式分解():

  • ABC=
    -文本字符串
  • ([+-]?\\d+)
    -捕获捕获组1中的正数或负数
  • Temp=
    -文本字符串
  • ([+-]?\\d+)
    -捕获捕获组2中的正数或负数
  • Try=
    -文本字符串
  • ([+-]?\\d+)
    -捕获组3中的正数或负数
  • 消息=
    -文本字符串
  • \”(.+)\“
    捕获捕获组4中双引号之间的字符串
  • SYS=
    -文本字符串
  • ([+-]?\\d+)
    -捕获组5中的正数或负数
如果
字符串
与模式匹配,则可以按如下方式提取值:

public static void main(String[] args) throws Exception {
    List<String> data = new ArrayList() {{
        add("ABC=-1 Temp=2 Try=34 Message=\"some text\" SYS=3");
        add("ABC=-1 Temp=5 Try=40 Message=\"some more \"and\" different text\" SYS=6");
    }};
    String pattern = "ABC=([+-]?\\d+) Temp=([+-]?\\d+) Try=([+-]?\\d+) Message=\"(.+)\" SYS=([+-]?\\d+)";

    int abc = 0;
    int temp = 0;
    int tryNum = 0;
    String message = "";
    int sys = 0;
    for (String d : data) {
        Matcher matcher = Pattern.compile(pattern).matcher(d);
        if (matcher.matches()) {
            abc = Integer.parseInt(matcher.group(1));
            temp = Integer.parseInt(matcher.group(2));
            tryNum = Integer.parseInt(matcher.group(3));
            message = matcher.group(4);
            sys = Integer.parseInt(matcher.group(5));

            System.out.printf("%d %d %d %s %d%n", abc, temp, tryNum, message, sys);
        }
    }
}

您可以使用
regex
进行此类解析,模式为:

"ABC=([+-]?\\d+) Temp=([+-]?\\d+) Try=([+-]?\\d+) Message=\"(.+)\" SYS=([+-]?\\d+)"
模式分解():

  • ABC=
    -文本字符串
  • ([+-]?\\d+)
    -捕获捕获组1中的正数或负数
  • Temp=
    -文本字符串
  • ([+-]?\\d+)
    -捕获捕获组2中的正数或负数
  • Try=
    -文本字符串
  • ([+-]?\\d+)
    -捕获组3中的正数或负数
  • 消息=
    -文本字符串
  • \”(.+)\“
    捕获捕获组4中双引号之间的字符串
  • SYS=
    -文本字符串
  • ([+-]?\\d+)
    -捕获组5中的正数或负数
如果
字符串
与模式匹配,则可以按如下方式提取值:

public static void main(String[] args) throws Exception {
    List<String> data = new ArrayList() {{
        add("ABC=-1 Temp=2 Try=34 Message=\"some text\" SYS=3");
        add("ABC=-1 Temp=5 Try=40 Message=\"some more \"and\" different text\" SYS=6");
    }};
    String pattern = "ABC=([+-]?\\d+) Temp=([+-]?\\d+) Try=([+-]?\\d+) Message=\"(.+)\" SYS=([+-]?\\d+)";

    int abc = 0;
    int temp = 0;
    int tryNum = 0;
    String message = "";
    int sys = 0;
    for (String d : data) {
        Matcher matcher = Pattern.compile(pattern).matcher(d);
        if (matcher.matches()) {
            abc = Integer.parseInt(matcher.group(1));
            temp = Integer.parseInt(matcher.group(2));
            tryNum = Integer.parseInt(matcher.group(3));
            message = matcher.group(4);
            sys = Integer.parseInt(matcher.group(5));

            System.out.printf("%d %d %d %s %d%n", abc, temp, tryNum, message, sys);
        }
    }
}


读一行,使用
“\\s+”
拆分,然后使用
“=”
拆分每个数组元素,然后检查索引0上的元素是什么,并相应地分配它。想发布一些代码并向我们展示您的尝试吗?@Tom He有一个字符串,其中可能包含空格。@ControlAltDel我发布了一些代码,但这是不正确的。@Tom如果我按空格分割它们,那么我的消息将被分割成许多标记。读一行,使用
“\\s+”
分割,然后使用
分割每个数组元素=”
然后检查索引0上的元素是什么,并相应地分配它。要发布一些代码并向我们展示您的尝试吗?@Tom He有一个字符串,可能包含空格。@ControlAltDel我发布了一些代码,但这是不正确的。@Tom如果我按空格分割它们,然后我的消息会被分割成许多标记。我担心消息会在makeData中被覆盖,并且无法包含完整的消息字符串。您已经测试过了吗?使用新扫描仪(文件)中的未知变量
file
并使用
MyData
类中的
static
构造函数:P@XOR我希望您使用这个答案,而不是其他答案,因为其他答案只是打印到控制台,没有以任何可用形式保存数据。请记住,您的“[^]+”模式将允许使用字母数字数据,而Integer.parseInt()@durron597会失败,这是一种更复杂的方法。谢谢,我一定会尽力的。我担心这封信会被改写