Hoe in Java naar een CSV-bestand te schrijven

1. Overzicht

In deze korte tutorial gaan we leren hoe u met Java naar een CSV-bestand schrijft. CSV staat voor Comma-Separated-Values ​​en het is een veelgebruikte indeling voor het uitvoeren van bulkgegevensoverdracht tussen systemen.

Om ons CSV-bestand te schrijven, gebruiken we klassen in de java.io pakket.

We zullen het hebben over speciale karakters en hoe ermee om te gaan. We richten ons op ons outputbestand om te openen in Microsoft Excel en Google Spreadsheets.

Na ons Java-voorbeeld zullen we een korte blik werpen op enkele beschikbare bibliotheken van derden voor het werken met CSV-bestanden.

2. Schrijven met PrintWriter

We gaan een PrintWriter voor het schrijven van ons CSV-bestand. Voor een meer gedetailleerde kijk op het gebruik van java.io Zie ons artikel over schrijven naar bestanden om naar een bestand te schrijven.

2.1. Het schrijven van de CSV

Laten we eerst een methode maken voor het opmaken van een enkele regel met gegevens, weergegeven als een array van Draads:

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

Voordat we deze methode aanroepen, gaan we eerst enkele voorbeeldgegevens verzamelen:

Lijst dataLines = nieuwe ArrayList (); dataLines.add (nieuwe String [] {"John", "Doe", "38", "Comment Data \ nEen andere regel met commentaar data"}); dataLines.add (nieuwe String [] {"Jane", "Doe, Jr.", "19", "Ze zei \" Ik word geciteerd \ ""});

En met die gegevens in de hand, laten we elke rij converteren met convertToCSV en schrijf het naar een bestand:

public void givenDataArray_whenConvertToCSV_thenOutputCreated () gooit IOException {File csvOutputFile = nieuw bestand (CSV_FILE_NAME); probeer (PrintWriter pw = nieuwe PrintWriter (csvOutputFile)) {dataLines.stream () .map (this :: convertToCSV) .forEach (pw :: println); } assertTrue (csvOutputFile.exists ()); }

2.2. Omgaan met speciale tekens

In een CSV-bestand zijn bepaalde tekens problematisch en als ontwikkelaars hebben we zelden volledige controle over de kwaliteit van onze gegevens. Laten we nu eens kijken hoe we met speciale tekens moeten omgaan.

Voor ons voorbeeld zullen we ons concentreren op komma's, aanhalingstekens en nieuwe regels. Velden die komma's of aanhalingstekens bevatten, worden tussen dubbele aanhalingstekens geplaatst en dubbele aanhalingstekens worden door dubbele aanhalingstekens geëscaped. We elimineren nieuwe regels en vervangen ze elk door witruimte.

Welke tekens een probleem vormen en hoe ze moeten worden behandeld, kan per gebruik verschillen.

Onze convertToCSV methode roept de escapeSpecialCharacters methode voor elk stukje data terwijl het een Draad.

Laten we onze escapeSpecialCharacters methode nu:

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. Bibliotheken van derden

Zoals we in ons voorbeeld hebben gezien, kan het schrijven van een CSV-bestand ingewikkeld worden als we nadenken over speciale tekens en hoe we ermee om moeten gaan.

Gelukkig voor ons, er zijn veel bibliotheken van derden beschikbaar voor het werken met CSV-bestanden en velen van hen behandelen deze speciale karakters en andere uitzonderlijke gevallen die kunnen voorkomen.

Laten we er een paar bekijken:

  • Apache Commons CSV: Apache's CSV-aanbod voor het werken met CSV-bestanden
  • Open CSV: een andere populaire en actief onderhouden CSV-bibliotheek
  • Flatpack: een open-source CSV-bibliotheek die actief wordt ontwikkeld
  • CSVeed: open-source en actief onderhouden

4. Conclusie

In dit korte artikel hebben we laten zien hoe je een CSV-bestand schrijft met Java's PrintWriter klasse. Vervolgens hebben we speciale tekens in de gegevens die worden uitgevoerd, besproken en afgehandeld.

Na ons eenvoudige Java-voorbeeld hebben we gekeken naar een overzicht van beschikbare bibliotheken van derden.

De voorbeeldcode is beschikbaar op GitHub.