我正试图从一个大文件中提取变量及其值。该文件有数千行,可能包含也可能不包含某些值。下面是一个示例文件
student name=james age=13 city=toronto
teacher name=joe age=31 city=chicago
student age=21 city=paris
我试图提取变量名称和它的值使用Java。换句话说,我想要得到type
,name
,age
和city
这是我的Java Pojo
public class MyPOJO {
private String type;
private String name;
private int age;
private String city;
public MyPOJO(String type, String name, int age, String city) {
this.type = type;
this.name = name;
this.age = age;
this.city = city;
}
//Getters and setters below
}
我的问题是什么是最好的方法?我不想使用grep,因为这个文件的内容可能会改变。我宁愿使用类似Pojo类的东西来提取值。
我目前的解决方案使用字符串分割,但我正在寻找一个更有效的方法。
public MyPOJO extract(String line){
String[] split = line.split(" ");
String type, name, city;
int age;
type = split[0];
for(String s : split){
if(s.contains("name"){
name = s.split("=")[1];
}
if(s.contains("city"){
name = s.split("=")[1];
}
if(s.contains("age"){
age = Integer.parseInt(s.split("=")[1]);
}
}
}
如果文件的结构不会改变,您可以使用正则表达式。
@Test
void parse() {
String text = """
student name=james age=13 city=toronto
teacher name=joe age=31 city=chicago
student age=21 city=paris
""";
String regex = "(student|teacher)\s+(name=(\w+)\s+)?age=(\d+)\s+city=(\w+)";
Pattern pattern = Pattern.compile(regex);
List<MyPOJO> pojos = pattern.matcher(text)
.results()
.map(match -> new MyPOJO(
match.group(1),
match.group(3),
Integer.parseInt(match.group(4)),
match.group(5)
))
.toList();
System.out.println(pojos);
}
简单地说,这就是正则表达式要查找的内容:
(student|teacher)
匹配"student"或"teacher"
s+
匹配一个或多个空白字符;
(name=(w+)s+)?
是一个可选组,匹配"name="后接一个或多个单词字符,后接一个或多个空白字符;
age=(d+)
matches "age="后面跟着一个或多个数字;
你可以在这里阅读更多关于正则表达式:https://www.baeldung.com/regular-expressions-java
如果您可能不使用POJO并将所有值视为String,那么以下将是一个有效的实现。
public static Map<String, String> extract(String line) {
Map<String, String> parsedLine = new HashMap<String, String>();
String[] allTokens = line.split(" ");
parsedLine.put("type", allTokens[0]);
for (int index = 1; index < allTokens.length; index++) {
String[] tokenParts = allTokens[index].split("=");
parsedLine.put(tokenParts[0], tokenParts[1]);
}
return parsedLine;
}