Запись в CSV-файл в Java

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

while (keys.hasNext()) {
    writer.append(keys.next().getCount());
    writer.append(',');
}

// where keys is the list of the keys

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

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

4 ответа

Решение

Это в значительной степени зависит от вас. Вот OpenCSV-эквивалент вашего кода:

 CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
 ...
 String[] row = new String[];
 int i=0;
 while(keys.hasNext()) {
     row[i++] = keys.next().getCount();
 }
 writer.writeNext(entries);

Это более или менее читабельно, чем у вас? Это субъективно и зависит от вас. Я могу сказать вам, что ваш не является неэффективным.

Стоит отметить, что ваш код будет писать "," в конце каждой строки. Библиотека не будет. Ваш код может быть изменен следующим образом:

boolean more = keys.hasNext();
while (more) {
   writer.append(keys.next().getCount());
   more = keys.hasNext();
   if(more) {
      writer.append(',');
   }
}

CSV кажется простым и обычно таковым, пока вы не столкнетесь с более сложными ситуациями, такими как поля в кавычках, содержащие запятые или экранированные кавычки:

 A field,"another field","a field, containing a comma","A \"field\""

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

Написание CSV-кода обычно простое, но есть подводные камни, и всегда хорошо иметь меньше кода для поддержки.

Использование библиотеки имеет свои накладные расходы - управление зависимостями и так далее.

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

Есть инженерный принцип - "Если это работает - не трогай его".

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

В вашем случае вы можете добиться большего контроля над разделителями полей и кодировками.

Использование библиотеки с открытым исходным кодом имеет несколько соображений:

Плюсы:

  • Нет сомнений в том, что библиотека с открытым исходным кодом прошла тщательную проверку сообщества и, следовательно, доступна в качестве одного из наиболее эффективных вариантов.
  • Сохраняет много стандартного кода и дает вам преимущество.
  • Библиотека упакована с большим количеством функций, чем вам нужно. Это помогает расширять приложение в будущем.
  • Как правило, библиотеки с открытым исходным кодом оптимизированы для производительности. Это экономит усилия на вашей стороне.

Минусы:

  • Еще одна зависимость добавлена ​​в ваше приложение.
  • Небольшая кривая обучения, связанная с использованием библиотеки. Я лично обесценил бы это, поскольку будет готовый код, доступный для использования библиотеки.
  • Немного излишним, если сценарий использования очень тривиален.

Формат файлаCSV - это не просто разделение имен или значений столбцов запятыми. Если в ваших данных есть запятая (,) или двойная кавычка ("), это должно быть правильно экранировано.

Например, если у вас есть два столбца имя и адрес. Значения, которые вам нужно написать: имя: aarish и адрес:"MyHome", Чикаго, Мичиган

Тогда если вы напишите, что в CSV вроде:

name,address
aarish,"MyHome",Chicago, MI

Значения будут проанализированы как четыре разных поля.

Если вы используете библиотеки, это даст вам вывод как CSV, как

"name","address"
"aarish","""MyHome"",Chicago, MI"

Этот файл будет другим парсером или будет правильно открыт в других редакторах.

Поэтому я бы посоветовал вам использовать библиотеки, если в ваших данных есть такие символы, как запятая (,) или двойная кавычка ("), если у вас нет таких символов, вы можете использовать более простой подход.

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