如何在 java 中的文件中找到一个 String 并获取它旁边的 String?
How to find a String in a file in java and get String next to it?
假设我有这样一个文件:
Name: someone1 surname
Age: someNumber1
Height: whoCares1
Weight: someWeight1
Name: someone2
Age: someNumber2
Height: whoCares2
Weight: someWeight2
Name: someone3
Age: someNumber3
Height: whoCares3
Weight: someWeight3
我想获取 ArrayList<String>
中 "Name:" 旁边的所有字符串。
我只想为此使用 Scanner
class。
我尝试使用如下代码从文件中获取 "Name:" 部分:
while(scanner.hasNextLine()) {
//read line by line
String line = scanner.nextLine();
//code to search for a word in the file which
if(line.indexOf("Name:")!=-1) {
// will search line by line for this word ignoring numbers in addition
// I find the word with this, what next?
// I want to get word next to Name: and not only from one but from all the instances of the word Name:
}
else
System.out.println("does not");
}
我想获取 "Name:" 旁边的单词,不仅来自一个单词,而且来自单词 "Name:" 的所有实例。
我该怎么做?
编辑:
此外,我如何分隔文件中的字符串,例如,如果我想将文件中第一人称的名称存储为一个 ArrayList 中的 someone1
和另一个 ArrayList 中的 surname
。我如何将它们分开,并让它们存储在新的 ArrayLists 中。
您可以尝试使用 String#matches
来确定感兴趣的行:
List<String> names = new ArrayList<>();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.matches("^Name:.*")) {
names.add(line.replaceAll("^Name:\s+", ""));
}
}
这里的想法是抓取所有以 Name:
开头的行,然后删除 Name:
前缀,留下您想要的内容。
使用正则表达式的说明:
^ from start of string (line)
Name: match text 'Name:'
\s+ followed by any number of spaces (or other whitespace)
因此,通过删除 ^Name:\s+
,我们应该只在其左侧留下名称信息。
编辑:
例如,如果您的姓名内容实际上是名字和姓氏,那么每一行将如下所示:
Name: George Washington
在这种情况下,如果格式固定,我们可以尝试使用String#split
来隔离名字和姓氏:
String[] parts = line.split("\s+");
String first = parts[1];
String last = parts[2];
// then store first and last in separate lists
你要做什么完全取决于你的实际数据。这里有很多边缘案例。也许有些行只有一个名字,或者有些行有中间名、首字母、后缀等。这只是给你一个大概的概念。
以下是从提供的文件中提取姓名列表的实用方法:
public List<String> getNames(File file) throws IOException {
return Files.lines(file.toPath())
.filter(str -> str.contains("Name: "))
.map(str -> str.split("Name: ")[1])
.collect(Collectors.toList());
}
假设我有这样一个文件:
Name: someone1 surname
Age: someNumber1
Height: whoCares1
Weight: someWeight1
Name: someone2
Age: someNumber2
Height: whoCares2
Weight: someWeight2
Name: someone3
Age: someNumber3
Height: whoCares3
Weight: someWeight3
我想获取 ArrayList<String>
中 "Name:" 旁边的所有字符串。
我只想为此使用 Scanner
class。
我尝试使用如下代码从文件中获取 "Name:" 部分:
while(scanner.hasNextLine()) {
//read line by line
String line = scanner.nextLine();
//code to search for a word in the file which
if(line.indexOf("Name:")!=-1) {
// will search line by line for this word ignoring numbers in addition
// I find the word with this, what next?
// I want to get word next to Name: and not only from one but from all the instances of the word Name:
}
else
System.out.println("does not");
}
我想获取 "Name:" 旁边的单词,不仅来自一个单词,而且来自单词 "Name:" 的所有实例。
我该怎么做?
编辑:
此外,我如何分隔文件中的字符串,例如,如果我想将文件中第一人称的名称存储为一个 ArrayList 中的 someone1
和另一个 ArrayList 中的 surname
。我如何将它们分开,并让它们存储在新的 ArrayLists 中。
您可以尝试使用 String#matches
来确定感兴趣的行:
List<String> names = new ArrayList<>();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.matches("^Name:.*")) {
names.add(line.replaceAll("^Name:\s+", ""));
}
}
这里的想法是抓取所有以 Name:
开头的行,然后删除 Name:
前缀,留下您想要的内容。
使用正则表达式的说明:
^ from start of string (line)
Name: match text 'Name:'
\s+ followed by any number of spaces (or other whitespace)
因此,通过删除 ^Name:\s+
,我们应该只在其左侧留下名称信息。
编辑:
例如,如果您的姓名内容实际上是名字和姓氏,那么每一行将如下所示:
Name: George Washington
在这种情况下,如果格式固定,我们可以尝试使用String#split
来隔离名字和姓氏:
String[] parts = line.split("\s+");
String first = parts[1];
String last = parts[2];
// then store first and last in separate lists
你要做什么完全取决于你的实际数据。这里有很多边缘案例。也许有些行只有一个名字,或者有些行有中间名、首字母、后缀等。这只是给你一个大概的概念。
以下是从提供的文件中提取姓名列表的实用方法:
public List<String> getNames(File file) throws IOException {
return Files.lines(file.toPath())
.filter(str -> str.contains("Name: "))
.map(str -> str.split("Name: ")[1])
.collect(Collectors.toList());
}