У меня есть метод Java, который получает строку значений CSV и целочисленный индекс для ссылки на столбец в строке CSV для анализа. Метод возвращает значение, связанное с целочисленным индексом в строке CSV.
Например, если у меня есть строка CSV с заголовком и вторая строка со значениями, определенными как:
String csvString = "Entry #,Date Created,Date Updated, IP Address
165,8/22/13 14:46,,11.222.33.444";
и целочисленный индекс, полученный методом, был равен 1, я ожидаю, что метод вернет строку "165"
И если целочисленный индекс, полученный методом, равен 2, я ожидаю, что метод вернет строку «8/22/13 14:46».
так далее,...
Я не хочу просто разбивать строку CSV запятыми, так как это может выглядеть некрасиво, и я уверен, что есть парсер CSV, который уже выполняет подобный синтаксический анализ. Судя по моим поискам в Google, OpenCSV или Jackson CsvMapper могут это сделать.
Я играл с библиотекой com.fasterxml.jackson.dataformat.csv.CsvMapper, чтобы проанализировать соответствующий столбец этой строки CSV, и вот что у меня есть:
int csvFieldIndex (this is the integer index passed into my method)
String csvString = "Entry #,Date Created,Date Updated, IP Address
165,8/22/13 14:46,,11.222.33.444";
CsvSchema csvSchema = CsvSchema.emptySchema().withHeader();
ObjectReader mapper = new CsvMapper().reader(Map.class).with(csvSchema);
MappingIterator<Map<String, Object>> iter = null;
iter = mapper.readValues(csvString);
while (iter.hasNext()) {
Map<String, Object> row = iter.next();
System.out.Println("row= " + row.toString());
}
Но этот итератор дает мне все значения csv, а это не то, что я хочу; Мне просто нужно одно значение, связанное с моим целочисленным индексом.
Вот что я получаю, когда запускаю этот фрагмент кода:
row= {Entry #=165, Date Created=8/22/13 14:46, Date Updated=, IP Address=11.222.33.444}
Есть ли способ использовать Jackson CsvMapper для этого?
======== ОБНОВЛЕНИЕ: ========
Основываясь на отзывах от keshlam, я смог разобрать столбец из CSV с помощью следующего кода:
CsvSchema csvSchema = CsvSchema.emptySchema().withHeader();
ObjectReader mapper = new CsvMapper().reader(Map.class).with(csvSchema);
MappingIterator<Map<String, Object>> iter = null;
iter = mapper.readValues(csvString);
// iterate over whole csv and store in a map
Map<String, Object> row = null;
while (iter.hasNext()) {
row = iter.next();
}
// now put the set of field names (keys) from this map into an array
String[] csvKeysArray = row.keySet().toArray(new String[0]);
int j = 0;
// loop over this array of keys and compare with csvFieldIndex
for (int i = 0; i < csvKeysArray.length; i++) {
// increment j by 1 since array index starts at 0 but input index starts at 1
j = i + 1;
if (j == csvFieldIndex) {
csvValue = row.get(csvKeysArray[i]).toString();
}
}
return csvValue;