Строка регулярного выражения для разделения массива элементов, накопленных в файле - PullRequest
0 голосов
/ 06 февраля 2020

Вот мой список элементов в файле

Name1
2019  8293
Name1
2019  8293
Name1
2019  8293
Name1
2019  8293

Я хочу проанализировать это и добавить данные в объект данных. Я хочу указать поля String name, int year и int population.

Но давайте скажем, что я хочу сначала поместить это в массив. Я накапливаю строку, а затем хочу разделить ее следующим образом: String[] array = output.split(regex);, а затем я хочу получить для массива значения [name1, 2019, 8293 , ...]

Что касается кода, у меня есть планируйте, как я справлюсь с этим, но этот формат файла действительно портит меня. Любая помощь будет оценена.

Примечание: я пытался "\r\n|\n|[ ]"

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Глядя на ваш пример желаемого вывода, в частности:

", а затем я хочу получить вывод для массива со значениями [name1, 2019, 8293 , ...]"

Вы можете сделать что-то вроде this:

String[] array = {}; // Array to hold the final readin in results
List<String> list = new ArrayList<>(); // List inteferface for processing file data.
try {
    // Using for/each and java.nio.file to process file contents.
    for (String line : Files.readAllLines(Paths.get("Data_File.txt"), StandardCharsets.UTF_8)) {
        line = line.trim(); // Trim the line of leading or trailing whitespaces.
        // Skip Blank Lines (if any) in file...
        if (line.equals("")) {
            continue;
        }
        // If a file line consists of two numerical values consisting
        // of one or more digits separated by one or more whitespaces... 
        if (line.matches("\\d+\\s+\\d+")) {
            // Split the line into Year and Population then
            // add them to the list.
            list.add(line.split("\\s+")[0]);  // Year
            list.add(line.split("\\s+")[1]);  // Population
        }
        // Otherwise the line must be a Name.
        else {
            // Add Name to the list.
            list.add(line);                   // Name
        }
    }
    // Convert List to String[] Array
    array = list.toArray(new String[0]);
}
catch (IOException ex) {
    System.err.println(ex);
}

// Display the results read in from file now contained within the array[] Array.
String arrayString = Arrays.toString(array);
// Remove Square Brackets ([]) for display.
System.out.println(arrayString.substring(1, arrayString.length() - 1)); 

Приведенный выше код хорошо прокомментирован и должен достаточно подробно объяснить, что делается. Если вам нужна дополнительная помощь, пожалуйста, не стесняйтесь спрашивать.

Data_File.txt Содержание:

Name1
2019  9999
Name2
2019  8585
Name3
2019  8888
Name4
2018  7777

Вывод на консоль после запуска вышеуказанного кода:

Name1, 2019, 9999, Name2, 2019, 8585, Name3, 2019, 8888, Name4, 2018, 7777
0 голосов
/ 06 февраля 2020

Вот код:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String args[]) throws Exception {
        List<String[]> result = new ArrayList<String[]>();
        Reader dataReader = new FileReader("D:\\data.txt");
        BufferedReader bufferReader = new BufferedReader(dataReader);
        try {
            String line;
            while ((line = bufferReader.readLine()) != null) {
                String[] yearAndPopulation = new String[2];
                String name;
                if (line.indexOf(' ') < 0) {
                    name = line;
                    //Read next line;
                    if((line = bufferReader.readLine()) != null) {
                        //replace all duplicated spaces by single space
                        line = line.trim().replaceAll(" +", " ");
                        yearAndPopulation = line.split(" ");
                        result.add(new String[] {name, yearAndPopulation[0], yearAndPopulation[1]});
                    }
                }
            }
            printResult(result);
        } finally {
            dataReader.close();
            bufferReader.close();
        }

    }

    private static void printResult(List<String[]> result) {
        for (String[] arr : result) {
            System.out.println(String.format("Name:%s, Year:%s, Population:%s", arr[0], arr[1], arr[2]));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...