Como gravar em um arquivo CSV em Java

Como gravar em um arquivo CSV em Java

1. Visão geral

Neste breve tutorial, vamos aprenderhow to write to a CSV file using Java. CSV significa valores separados por vírgula e é um formato comum para fazer uma transferência de dados em massa entre sistemas.

Para escrever nosso arquivo CSV, usaremos classes no pacotejava.io.

We’ll talk about special characters e como lidar com eles. Estaremos direcionando nosso arquivo de saídato open in Microsoft Excel and Google Sheets.

Após nosso exemplo Java, daremos uma breve olhada emsome available third-party libraries for working with CSV files.

2. Escrevendo comPrintWriter

Vamos usar umPrintWriter para escrever nosso arquivo CSV. Para uma visão mais detalhada sobre como usarjava.io para gravar em um arquivo, consulte nossoarticle on writing to files.

2.1. Escrevendo o CSV

Primeiro, vamos criar um método para formatar uma única linha de dados, representada como uma matriz deStrings:

public String convertToCSV(String[] data) {
    return Stream.of(data)
      .map(this::escapeSpecialCharacters)
      .collect(Collectors.joining(","));
}

Antes de chamar esse método, porém, vamos construir alguns dados de exemplo:

List dataLines = new ArrayList<>();
dataLines.add(new String[]
  { "John", "Doe", "38", "Comment Data\nAnother line of comment data" });
dataLines.add(new String[]
  { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });

E com esses dados em mãos, vamos converter cada linha comconvertToCSVe gravá-la em um arquivo:

public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException {
    File csvOutputFile = new File(CSV_FILE_NAME);
    try (PrintWriter pw = new PrintWriter(csvOutputFile)) {
        dataLines.stream()
          .map(this::convertToCSV)
          .forEach(pw::println);
    }
    assertTrue(csvOutputFile.exists());
}

2.2. Manipulação de caracteres especiais

Em um arquivo CSV, certos caracteres são problemáticos e, como desenvolvedores, raramente temos controle total sobre a qualidade de nossos dados. So let’s look now at how to handle special characters.

Para o nosso exemplo, vamos nos concentrar em vírgulas, aspas e novas linhas. Fields containing commas or quotes will be surrounded by double quotes and double quotes will be escaped with double quotes. Eliminaremos novas linhas e as substituiremos por espaços em branco.

Quais caracteres são um problema e como eles devem ser tratados podem variar de acordo com o caso de uso.

Nosso métodoconvertToCSV chama o métodoescapeSpecialCharacters em cada parte dos dados enquanto está construindo umString.

Vamos implementar nosso métodoescapeSpecialCharacters agora:

public String escapeSpecialCharacters(String data) {
    String escapedData = data.replaceAll("\\R", " ");
    if (data.contains(",") || data.contains("\"") || data.contains("'")) {
        data = data.replace("\"", "\"\"");
        escapedData = "\"" + data + "\"";
    }
    return escapedData;
}

3. Bibliotecas de terceiros

Como vimos em nosso exemplo, escrever um arquivo CSV pode se tornar complicado quando começamos a pensar em caracteres especiais e em como lidar com eles.

Felizmente para nós,there are many third-party libraries available for working with CSV files e muitos deles lidam com esses caracteres especiais e outros casos excepcionais que podem ocorrer.

Vamos dar uma olhada em alguns deles:

  • Apache Commons CSV: oferta CSV do Apache para trabalhar com arquivos CSV

  • Open CSV: outra biblioteca CSV popular e ativamente mantida

  • Flatpack: Uma biblioteca CSV de código aberto sendo ativamente desenvolvida

  • CSVeed: código aberto e com manutenção ativa

4. Conclusão

Neste artigo rápido, mostramos como escrever um arquivo CSV usando a classePrintWriter do Java. Em seguida, discutimos e manipulamos caracteres especiais nos dados que estão sendo produzidos.

Após o nosso exemplo simples de Java, vimos uma visão geral das bibliotecas de terceiros disponíveis.

O código de exemplo está disponívelover on GitHub.