Эффективный по времени способ преобразовать список массивов строк в файл CSV с помощью StringBuilder? - PullRequest
1 голос
/ 12 июля 2020

У меня есть список массивов строк, которые мне нужно эффективно записать в файл CSV. Я пробовал это двумя способами ниже.

Набор данных - это файл размером не менее 1 миллиона записей. ie. returnedList имеет как минимум 1 миллион String[] массивов.

Мой текущий код ужасно неэффективен и занимает слишком много времени при использовании StringBuilder:

BufferedWriter br = new BufferedWriter(new FileWriter(filePath + "test.csv"));

for(String[] listEntry : returnedList) {
  // convert each array to a string first
  for(String s : listEntry) {
    builder.append(s);
  }
  String str = builder.toString();
  br.write(str);
  br.newLine();
}
br.close();
assertThat(newFirstRow).isNotEmpty();

Моя вторая попытка была с использованием OpenCsv API:

Writer writer = Files.newBufferedWriter(Paths.get(filePath + "test.csv"));
StatefulBeanToCsv<String[]> beanToCsv = new StatefulBeanToCsvBuilder(writer)
        .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
        .build();
beanToCsv.write(returnedList);

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

Я неправильно использую библиотеку OpenCsv?

1 Ответ

2 голосов
/ 12 июля 2020

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

for(String[] listEntry : returnedList) {
  for(String s : listEntry) {
    br.append(s);
  }
  br.flush(str);
  br.newLine();
}
//If memory constrain allows Flush everything in one go here and close instead of doing flush() in for loop
br.close();
...