Запись / добавление данных в файл 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/

Другие вопросы по тегам