Как разобрать строку текста с двумя отдельными частями данных? - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в разборе (и новичке в Java), поэтому я просто хочу быть уверен, что я правильно это понимаю.

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

Текстовые данные обычно вставляются пользователем в эту форму:

john 48915
beth 10431
frank 10112
anne 34887
taserface 90090
bill 56448

Я использую регулярное выражение "^ \ d + \ t. * \ D + $", чтобы обнаружить шаблон, и после подтверждения шаблона мой код данных анализа выполняет следующее:

Scanner parser = new Scanner(inputText);
    parser.useDelimiter("\\n");
    while (parser.hasNext()) {
        String nextToken = parser.next();
        String name = nextToken.trim();
        // how do I get the number?

Вы заметите разделитель \ n, который анализирует данные по символу новой строки. Это разбивает данные на строки, но не разбивает каждую строку на две отдельные точки данных. Мне нужно взять имя и номер отдельно.

Полагаю, мне следует использовать разделитель пробелов, но я не уверен, стоит ли делать это одним или двумя различными шагами. Я полагаю, что путаница проистекает из моего ограниченного понимания того, как работает сканер. Но после просмотра документации по Java я все еще не совсем уверен.

Токовый выход:

john 48915

beth 10431

frank 10112

и т.д.

Ожидаемый результат:

john

48915

beth

10431

и т.д.

Должен ли я выполнять два разных цикла анализа или я могу выполнить работу за один проход?

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Ваша проблема в том, что вы используете \n в качестве разделителя. Это приводит к тому, что входные данные, которые вы передаете в сканер, ограничиваются только переносами строк, а не тем, что вы ожидаете также в пробелах.

Одно из возможных решений - просто удалить следующую строку: parser.useDelimiter("\\n");


Решение, которое также будет работать, следующее:

    try (Scanner parser = new Scanner(inputText)) {
        while (parser.hasNextLine()) {
            String nextLine = parser.nextLine();
            String[] strings = nextLine.split("\\s");
            // Here you can use any pattern to split the line
            String name = strings[0];
            String number = strings[1];
            System.out.printf("%s%n%s%n", name, number);
        }
    }

Это приводит к следующему выводу:

john 48915 beth 10431 frank 10112 anne 34887 taserface 90090 bill 56448

Решение дает вам больше контроля над строками и способом разбора имени и номера.

1 голос
/ 28 марта 2019

Вот пример реализации для вашего случая, который предлагает больше контроля и гибкости, чтобы приспособиться к изменению разделителей -

import java.util.Arrays;

public class StringSplitExample {

     public static void main(String []args){
        String content = "john 48915\n"  
                         + "beth 10431\n"
                         + "frank 10112\n"
                         + "anne 34887\n"
                         + "taserface 90090\n"
                         + "bill 56448";

        String[] dataset = content.split("\\n|\\s");

        for (String value : dataset) {
            System.out.println(value);
        }
     }
}

И, следующий вывод для приведенного выше фрагмента кода -

john
48915
beth
10431
frank
10112
anne
34887
taserface
90090
bill
56448
0 голосов
/ 28 марта 2019

Вы можете достичь этой функциональности с помощью метода String spilled, ниже приведена та же программа и вывод, что и вы.

Я думаю, что без пробела пользователь не сможет перейти на следующую строку при заполнении формы.

  public class ParseLineText {
    public static void main(String[] args) {
        String textData = "john 48915 " + 
                          "beth 10431 " + 
                          "frank 10112 " + 
                          "anne 34887 " + 
                          "taserface 90090 " + 
                          "bill 56448 ";
        String[] data = textData.split("\\s");
        for (String text : data) {
            System.out.println(text);
        }
    }
}
Output:
john
48915
beth
10431
frank
10112
anne
34887
taserface
90090
bill
56448
...