Как найти строку в файле в Java и получить строку рядом с ним? - PullRequest
0 голосов
/ 23 октября 2018

Предположим, у меня есть файл, подобный этому:

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>.

Я хочу толькоиспользовать Scanner класс для этого.

Я пытался получить часть "Имя:" из файла, используя такой код:

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");


        }

Я хочу получить слово следующимв «Имя:» и не только из одного, но из всех экземпляров слова «Имя:».

Как я могу это сделать?

Редактировать:

Кроме того, как разделить строки внутри файла, например, если я хочу сохранить имя первого лица в файле как someone1 в одном ArrayList и surname в другом ArrayList.Как мне отделить их и заставить хранить их в новых списках ArrayLists.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Ниже приведен функциональный подход к извлечению списка имен из предоставленного файла:

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());
}
0 голосов
/ 23 октября 2018

Вы можете попытаться использовать 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

То, что вы будете делать, точно зависит от ваших фактических данных.Здесь много крайних случаев.Возможно, некоторые строки имеют только одно имя, или некоторые строки имеют отчество, инициал, суффикс и т. Д. Это просто для того, чтобы дать вам общее представление.

...