Разбор данных из CSV в массив в Java - PullRequest
6 голосов
/ 30 июня 2011

Я пытаюсь импортировать файл 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 ]

6 голосов
/ 30 июня 2011

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

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

2 голосов
/ 16 мая 2015

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

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
    // ......
}

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

2 голосов
/ 10 сентября 2012

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

 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();
    }

}

}

0 голосов
/ 30 июня 2011

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

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