Как я могу прочитать файл CSV с JAVA - PullRequest
0 голосов
/ 07 октября 2019

У меня есть проблема, и я еще не нашел никакого решения. Следующая проблема: я должен прочитать файл CSV, который должен выглядеть следующим образом:

First Name,Second Name,Age,

Lucas,Miller,17,

Bob,Jefferson,55,

Andrew,Washington,31,

Назначение - прочитать этот файл CSV с помощью JAVA и отобразить его так:

First Name: Lucas

Second Name: Miller

Age: 17

Имена атрибутов не всегда одинаковы, поэтому они также могут быть:

Street,Number,Postal Code,ID,

Schoolstreet,93,20000,364236492,

("," необходимо заменить на ";")

Также адрес файла не являетсявсегда одно и то же. У меня уже есть вид и т.д. Мне нужна только МОДЕЛЬ.

Спасибо за вашу помощь. :))

У меня уже есть класс FileChooser в Controller, который возвращает URI.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Если ваши CSV-файлы всегда содержат строку заголовка, в которой указаны имена столбцов таблицы, тогда нужно просто перехватить эту строку и разбить ее так, чтобы поместить имена этих столбцов в массив строк (или коллекцию, или что-то еще)). Длина этого массива определяет ожидаемый объем данных для каждой строки данных записи. Когда у вас есть имена столбцов, оттуда становится относительно легко.

Как вы узнаете путь к файлу CSV и тип его формата, очевидно, зависит от вас, но вот общая концепция, как выполнить поставленную задачу:

public static void readCsvToConsole(String csvFilePath, String csvDelimiter) {
    String line;                            // To hold each valid data line.
    String[] columnNames = new String[0];   // To hold Header names.
    int dataLineCount = 0;                  // Count the file lines.
    StringBuilder sb = new StringBuilder(); // Used to build the output String.
    String ls = System.lineSeparator();     // Use System Line Seperator for output.

    // 'Try With Resources' to auto-close the reader
    try (BufferedReader br = new BufferedReader(new FileReader(csvFilePath))) {
        while ((line = br.readLine()) != null) {
            // Skip Blank Lines (if any).
            if (line.trim().equals("")) {
                continue;
            }
            dataLineCount++;
            // Deal with the Header Line. Line 1 in most CSV files is the Header Line.
            if (dataLineCount == 1) {
                /* The Regular Expression used in the String#split()
                   method handles any delimiter/spacing situation.*/
                columnNames = line.split("\\s{0,}" + csvDelimiter + "\\s{0,}");
                continue;   // Don't process this line anymore. Continue loop.
            }
            // Split the file data line into its respective columnar slot.
            String[] lineParts = line.split("\\s{0,}" + csvDelimiter + "\\s{0,}");
            /* Iterate through the Column Names and buld a String
               using the column names and its' respective data along
               with a line break after each Column/Data line.     */
            for (int i = 0; i < columnNames.length; i++) {
                sb.append(columnNames[i]).append(": ").append(lineParts[i]).append(ls);
            }
            // Display the data record in Console.
            System.out.println(sb.toString());  
            /* Clear the StringBuilder object to prepare for 
               a new string creation.     */
            sb.delete(0, sb.capacity());        
        }
    }
    // Trap these Exceptions
    catch (FileNotFoundException ex) {
        System.err.println(ex.getMessage());
    }
    catch (IOException ex) {
        System.err.println(ex.getMessage());
    }
}

С помощью этого метода вы можете иметь от 1 до тысячи столбцов, это не имеет значения (не то, что у вас когда-либо будут тысячи столбцов данных в любой заданной записи, но эй .... вы никогда не знаете... лол). И использовать этот метод:

// Read CSV To Console Window.
readCsvToConsole("test.csv", ",");
0 голосов
/ 07 октября 2019

Вот код, над которым я недавно работал для интервью, который может помочь: https://github.com/KemarCodes/ms3_csv/blob/master/src/main/java/CSVProcess.java

Если у вас всегда есть 3 атрибута, я прочитал бы первую строку csv и установил значения в объекте. у которого есть три поля: attribute1, attribute2 и attribute3. Я хотел бы создать другой класс для хранения трех значений и прочитать все строки после, создавая новый экземпляр каждый раз и читая их в списке массивов. Для печати я просто печатал бы значения в классе атрибутов каждый раз вместе с каждым набором значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...