Как мне прочитать несколько токенов между символами в java? - PullRequest
0 голосов
/ 15 апреля 2020

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

Например:

name,lastname,email,hobbies1;hobbies2...hobbiesN,activity1;activity2...activityN

name2,lastname2,email.... and so on

Я не знаю, сколько существует хобби или занятий, поэтому я должен установить их в массив. Все переменные находятся в одной строке. Я попытался использовать разделитель и разбиение, но когда я перехожу на следующую строку, я получаю inputMismatchException.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Чтение строк, затем разделение на запятую и разделение на точку с запятой, где это необходимо.

Не используйте Scanner для чтения строки файла.

try (BufferedReader in = Files.newBufferedReader(Paths.get("test.txt"))) {
    for (String line; (line = in.readLine()) != null; ) {
        String[] fields = line.split(",");
        String   name =       (fields.length >= 1 ? fields[0] : "");
        String   lastname =   (fields.length >= 2 ? fields[1] : "");
        String   email =      (fields.length >= 3 ? fields[2] : "");
        String[] hobbies =    (fields.length >= 4 ? fields[3].split(";") : new String[0]);
        String[] activities = (fields.length >= 5 ? fields[4].split(";") : new String[0]);
        System.out.println("name=" + name +
                         ", lastname=" + lastname +
                         ", email=" + email +
                         ", hobbies=" + Arrays.toString(hobbies) +
                         ", activities=" + Arrays.toString(activities));
    }
}

test.txt

name,lastname,email,hobbies1;hobbies2...hobbiesN,activity1;activity2...activityN
name2,lastname2,email

Выход

name=name, lastname=lastname, email=email, hobbies=[hobbies1, hobbies2...hobbiesN], activities=[activity1, activity2...activityN]
name=name2, lastname=lastname2, email=email, hobbies=[], activities=[]
0 голосов
/ 15 апреля 2020

Самый простой способ - изменить формат.

Вместо разделения каждого поля с помощью , попробуйте использовать ; для разделения различных типов атрибутов и , для элементов массивов. Конечным результатом будет что-то вроде:

name; lastname; email; hobbies1, hobbies2, ..., hobbiesN; activity1, activity2, ..., activityN

Сначала вы разделяете String, используя ; в качестве разделителя, затем для тех полей, которые допускают массивы, вы делите массив на его элементы путем разбиения этой под String с , в качестве разделителя.

...