Java 如何将文件内容解析为变量?
我的文本文件如下所示: ABC=-1 Temp=2 Try=34 Message=“some text”SYS=3Java 如何将文件内容解析为变量?,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=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=
-捕获捕获组1中的正数或负数([+-]?\\d+)
-文本字符串Temp=
-捕获捕获组2中的正数或负数([+-]?\\d+)
-文本字符串Try=
-捕获组3中的正数或负数([+-]?\\d+)
-文本字符串消息=
捕获捕获组4中双引号之间的字符串\”(.+)\“
-文本字符串SYS=
-捕获组5中的正数或负数([+-]?\\d+)
字符串
与模式匹配,则可以按如下方式提取值:
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=
-捕获捕获组1中的正数或负数([+-]?\\d+)
-文本字符串Temp=
-捕获捕获组2中的正数或负数([+-]?\\d+)
-文本字符串Try=
-捕获组3中的正数或负数([+-]?\\d+)
-文本字符串消息=
捕获捕获组4中双引号之间的字符串\”(.+)\“
-文本字符串SYS=
-捕获组5中的正数或负数([+-]?\\d+)
字符串
与模式匹配,则可以按如下方式提取值:
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会失败,这是一种更复杂的方法。谢谢,我一定会尽力的。我担心这封信会被改写