Запись / добавление данных в файл CSV по столбцам в JAVA
Я хочу записывать / добавлять данные в файл CSV, столбец за столбцом, следующим образом:
query1 query2 query3
data_item1 data_item7 data_item12
data_item2 data_item8 data_item13
data_item3 data_item9 data_item14
data_item4 data_item10
data_item5 data_item11
data_item6
У меня есть данные в hashMap, причем queryID (например, query1,query2) является ключом, а data_items для соответствующих запросов - значениями. Значения (data_items для каждого запроса) находятся в списке. Поэтому моя хеш-карта выглядит так:
HashMap<String,List<String>> hm = new HashMap<String,List<String>>();
Как я могу записать эти данные, столбец за столбцом, в CSV, как показано выше, с помощью JAVA? Я пробовал CSVWriter, но не смог. Кто-нибудь может мне помочь?
2 ответа
После нескольких дней возни мне, наконец, удалось. Вот реализация:
for(int k=0;k<maxRows;k++) {
List<String> rowValues = new ArrayList<String>();
for(int i=0;i<queryIdListArr.length;i++) {
subList = qValuesList.subList(i, i+1);
List<String> subList2 = subList.stream().flatMap(List::stream).collect(Collectors.toList());
if(subList2.size()<=k) {
rowValues.add("");
}else{
rowValues.add(subList2.get(k));
}
}
String[] rowValuesArr = new String[rowValues.size()];
rowValuesArr = rowValues.toArray(rowValuesArr);
// System.out.println(rowValues);
writer.writeNext(rowValuesArr);
}
maxRows: Размер списка значений с максимальным размером. У меня есть список значений для каждого ключа. Моя хеш-карта выглядит так
HashMap<String,List<String>> hm = new HashMap<String,List<String>>();
queryIdListArr: список всех значений, полученных из хэш-карты.
qValuesList: Список всех списков значений.
List<List<String>> qValuesList = new ArrayList<List<String>>();
subList2: подсписок, полученный из qValuesList с использованием синтаксиса ниже:
qValuesList.subList(i, i+1);
rowValuesArr - это массив, который заполняется значением индекса для каждого значения, полученного из qValuesList. Идея состоит в том, чтобы получить все значения для каждого индекса из всех подсписок, а затем записать эти значения в строку. Если для этого индекса значение не найдено, введите пустой символ.
Файлы csv в основном используются для сохранения данных, структурированных как таблица... что означает данные со столбцами и строками, которые находятся в тесном контексте.
В вашем примере кажется, что существует только очень слабая связь между запросами 1, 2 и 3 и отсутствует связь по горизонтали между элементами 1,7 и 12 или 2, 8 и 13 и так далее.
Кроме того, запись в файлы обычно выполняется по строкам или строкам. Итак, вы открываете свой файл, пишете одну строчку, потом другую и так далее.
Итак, чтобы записать данные по столбцам, как вы просите, вы должны либо реструктурировать свои данные в своем коде, чтобы все данные, которые записаны в одной строке, были доступны при написании этой строки, либо пройти через ваш файл csv и строки несколько раз, каждый раз добавляя новый элемент в строку. Конечно, последний вариант очень трудоемок и не имеет особого смысла.
Поэтому я бы посоветовал, если действительно нет связи между данными трех запросов, вы либо записываете свои данные в 3 разных файла csv: query1.csv, 2.csv и 3.csv.
Или, если у вас есть горизонтальное соединение, то есть между элементами 1,7 и 12, и так далее, вы записываете его в один файл csv, организуя данные в строки и столбцы. Что-то типа:
queryNo columnX columnY columnZ
1 item1 item2 item3
2 item7 item8 item9
3 item12 item13 item14
Как это сделать, хорошо описано в этой теме: Java - Запись строк в файл CSV. Другие примеры вы также можете найти здесь https://mkyong.com/java/how-to-export-data-to-csv-file-java/