Как динамически добавлять заголовки CSV, в то время как в файлы добавляется больше строк - PullRequest
0 голосов
/ 06 мая 2018

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

lang=java                           lang, version, maven
version=1.8              ----->     java, 1.8, true
maven=true

и другой ввод может быть:

lang=C#                           lang, version, maven
version=7.2              ----->   java, 1.8, true
maven=false                       C#, 7.2, false  

Число списков может составлять несколько миллионов, поэтому мне нужно сбросить данные на диск, и я не могу хранить все это в памяти.

Поскольку список ключей определяется клиентом, я, однако, использую первый вход от него для определения заголовков файла CSV:

org.apache.commons.csv.CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(x, y, z ...)));

и с этого момента добавлять только значения в соответствующих столбцах:

csvPrinter.printRecord(xValue, yValue, zValue.....)

Однако, это непослушный клиент, и иногда он посылает новый ключ, который я никогда раньше не видел:

lang=java
meetMeAt=London
version=1.4
maven=false

Как, на данный момент, я могу добавить еще один заголовок в CSV?

Как насчет того, чтобы сначала сохранить все списки в CSV-файле без заголовков , накопить все заголовки в памяти программы, а затем создать другой файл со всеми заголовками и скопировать в него записи из первого файла ? Разумно ли это?

1 Ответ

0 голосов
/ 06 мая 2018

Предложенное вами решение имеет проблему, которую нам нужно решить:

lang=java                           java, 1.8, true
version=1.8              ----->     
maven=true

lang=java                           java, 1.8, true
version=1.8              ----->           ???
gradle=true

Как вы хотите это представить? Добавить еще один столбец? Откуда вы знаете, что вам нужно добавить еще один столбец, если вы не знаете заголовков столбцов?

Если вы можете позволить себе прочитать входные данные дважды, я предлагаю вам собрать заголовки при первом чтении, а затем перечитать с уже известными заголовками и позициями столбцов.

Если вам нужно прочитать ввод только один раз, ваша идея может работать следующим образом:

  • Сохранять заголовки и соответствующие позиции столбцов в памяти
  • Напишите CSV без заголовков, но поместите все данные в правильные столбцы
    • Обратите внимание, что число столбцов может увеличиваться, причем первые строки имеют меньше столбцов, чем последние
  • Когда вы закончите с исходным вводом, переписайте вывод CSV:
    • Поставить заголовки на первую строку
    • Добавить отсутствующие столбцы во все строки, которые меньше конечного числа столбцов
...