Запись / добавление данных в файл CSV по столбцам в JAVA - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу записать / добавить данные в файл 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 для каждого запроса) находятся в списке. Поэтому моя карта ha sh выглядит следующим образом:

HashMap<String,List<String>> hm = new HashMap<String,List<String>>();

Как я могу записать эти данные, столбец за столбцом в CSV, как показано выше, используя JAVA? Я попробовал CSVWriter, но не смог этого сделать. Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

После нескольких дней возни мне наконец удалось. Вот реализация:

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: размер списка значений с максимальным размером. У меня есть список значений для каждого ключа. Моя карта ha sh выглядит следующим образом

 HashMap<String,List<String>> hm = new HashMap<String,List<String>>();

queryIdListArr: список всех значений, полученных из карты ha sh.

qValuesList: список всех списков значений.

List<List<String>> qValuesList = new ArrayList<List<String>>();

subList2: подсписок, полученный из qValuesList с использованием следующего синтаксиса:

qValuesList.subList(i, i+1);

rowValuesArr - это массив, который заполняется индексным значением для каждого значения, выбранного из qValuesList. Идея состоит в том, чтобы извлечь все значения для каждого индекса из всех подсписков, а затем записать эти значения в строку. Если для этого индекса значение не найдено, напишите пустой символ.

0 голосов
/ 21 февраля 2020

CSV-файлы в основном используются для сохранения данных, структурированных как таблица ... то есть данных со столбцами и строками, которые находятся в тесном контексте.

В вашем примере, кажется, существует только очень слабая связь между query1, 2 и 3, и нет горизонтального соединения между пунктами 1,7 и 12, или 2, 8 и 13 и т. д.

Кроме того, запись в файлы обычно облегчается вдоль строк или строк. Таким образом, вы открываете свой файл, записываете одну строку, а затем другую и т. Д.

Таким образом, чтобы записать данные по столбцам, как вы просите, вы должны либо реструктурировать свои данные в коде, чтобы иметь все данные, которые записывается в одну строку, доступную при написании этой строки, или проходит через ваш CSV-файл и его строки несколько раз, каждый раз добавляя другой элемент в строку. Конечно, последний вариант занимает очень много времени и не имеет особого смысла.

Поэтому я хотел бы предложить, если между данными 3 запросов действительно нет связи, вы либо записываете свои данные в 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...