Анализ данных из 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++)