Анализ файла CSV для уникальной строки с использованием нового API-интерфейса Java 8 Streams
Я пытаюсь использовать новый API-интерфейс Java 8 Streams (для которого я являюсь новичком) для анализа определенной строки (с «Недой» в столбце имени) в файле CSV. Используя следующеестатья для мотивации я изменил и исправил некоторые ошибки, чтобы можно было проанализировать файл, содержащий 3 столбца - «имя», «возраст» и «высота».
name,age,height
Marianne,12,61
Julie,13,73
Neda,14,66
Julia,15,62
Maryam,18,70
Код синтаксического анализа выглядит следующим образом:
@Override
public void init() throws Exception {
Map<String, String> params = getParameters().getNamed();
if (params.containsKey("csvfile")) {
Path path = Paths.get(params.get("csvfile"));
if (Files.exists(path)){
// use the new java 8 streams api to read the CSV column headings
Stream<String> lines = Files.lines(path);
List<String> columns = lines
.findFirst()
.map((line) -> Arrays.asList(line.split(",")))
.get();
columns.forEach((l)->System.out.println(l));
// find the relevant sections from the CSV file
// we are only interested in the row with Neda's name
int nameIndex = columns.indexOf("name");
int ageIndex columns.indexOf("age");
int heightIndex = columns.indexOf("height");
// we need to know the index positions of the
// have to re-read the csv file to extract the values
lines = Files.lines(path);
List<List<String>> values = lines
.skip(1)
.map((line) -> Arrays.asList(line.split(",")))
.collect(Collectors.toList());
values.forEach((l)->System.out.println(l));
}
}
}
Есть ли способ избежать повторного чтения файла после извлечения строки заголовка? Хотя это очень маленький пример файла, я буду применять эту логику к большому файлу CSV.
Есть ли способ использовать API потоков для создания карты между извлеченными именами столбцов (при первом сканировании файла) и значениями в оставшихся строках?
Как я могу вернуть только одну строку в видеList<String>
(вместоList<List<String>>
содержащий все строки). Я бы предпочел просто найти строку как отображение между именами столбцов и их соответствующими значениями. (немного похоже на набор результатов в JDBC). Я вижу функцию Collectors.mapMerger, которая может быть полезна здесь, но я не знаю, как ее использовать.