Анализ данных из CSV в массив на Java

Я пытаюсь импортировать CSV-файл в массив, который я могу использовать в Java-программы. Файл CSV успешно импортировал себя, и вывод появляется на терминале, но он выдает ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
at CompareCSV.main(CompareCSV.java:19)

в конце. Кроме того, когда я пытаюсь вызвать элементы в массиве, он также показывает ту же ошибку. Мой код ниже:

import java.io.*;
import java.util.*;

public class CompareCSV {

    public static void main(String[] args) {

        String fileName = "sampledata1.csv";
        try {
            BufferedReader br = new BufferedReader( new FileReader(fileName));
            String strLine = null;
            StringTokenizer st = null;
            int lineNumber = 0, tokenNumber = 0;

            while((fileName = br.readLine()) != null) {
                lineNumber++;
                String[] result = fileName.split(",");
                for (int x=0; x<result.length; x++) {
                    System.out.println(result[x]);
                }
            }
        }

        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   
}

4 ответов


вам гораздо лучше использовать правильный парсер CSV, чем взламывать неисправный самостоятельно:http://opencsv.sourceforge.net/

CSV-это не простой формат, который можно было бы подумать (да, строка может содержать , Это не разделяет две части данных).


Это ответ на вопрос выше

 public class Readline {

/**
 * @param args
 */
public static void main(String[] args) {
    String fileName = "C:/Users/karthikrao/Desktop/cvsFile.csv";
    ArrayList<Integer> margins = new ArrayList<Integer>();
    BufferedReader br;
    String line, token;
    int i;
    try {
        br = new BufferedReader(new FileReader(fileName));
        try {
            while ((line = br.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line, ",\"");
                i = 0;
                while (st.hasMoreTokens()) {
                    token = st.nextToken();
                    if (margins.size() <= i) {
                        margins.add((Integer) token.length());
                    } else {
                        margins.set(
                                i,
                                Math.max(margins.get(i),
                                        (Integer) token.length()));
                    }
                    i++;
                }
            }

            br = new BufferedReader(new FileReader(fileName));
            while ((line = br.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line, ",\"");
                i = 0;
                while (st.hasMoreTokens()) {
                    token = st.nextToken();
                    System.out.print(token);
                    for (int j = 0; j < margins.get(i) - token.length(); j++) {
                        System.out.print(" ");
                    }
                    System.out.print("|");
                    i++;
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

}

}


Я предлагаю вам не изобретать колесо, когда есть так много больших библиотек. Попробуйте однозначности-Парсеры следующий код snippt как ссылка:

public static void main(String[] args) throws FileNotFoundException {

    /**
     * ---------------------------------------
     * Read CSV rows into 2-dimensional array
     * ---------------------------------------
     */

    // 1st, creates a CSV parser with the configs
    CsvParser parser = new CsvParser(new CsvParserSettings());

    // 2nd, parses all rows from the CSV file into a 2-dimensional array
    List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv"));

    // 3rd, process the 2-dimensional array with business logic
    // ......
}

Как вы можете видеть, только 2 строки, необходимые для завершения задачи разбора данных csv в массив. Кроме того, библиотека предоставляет полный список функций при анализе данных CSV с отличной производительностью.


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

for (int x=0; x<result.length; x++)