2008-09-19 7 views
150

Kann mir jemand eine einfache API empfehlen, die es mir erlaubt, eine CSV-Eingabedatei zu lesen, einige einfache Transformationen durchzuführen und dann zu schreiben.CSV-API für Java

Eine schnelle Google hat http://flatpack.sourceforge.net/ gefunden, die vielversprechend aussieht.

Ich wollte nur überprüfen, was andere verwenden, bevor ich mich an diese API kupple.

Antwort

23

Apache Commons CSV

Scheck derjenige von apache aus.

+0

Ich habe die Sandboxed Commons CSV für ziemlich lange Zeit verwendet und noch nie ein Problem erlebt. Ich hoffe wirklich, dass sie es zu vollem Ansehen fördern und es aus dem Sandkasten holen. –

+2

@ bmatthews68 der Sandbox-Link ist nicht mehr vorhanden - sieht so aus, als wäre er nach [Apache Commons Proper] verschoben (http://commons.apache.org/proper/commons-csv/) (Ich habe den Link in der Antwort auch bearbeitet) – drevicko

8

Wir JavaCSV verwenden, es funktioniert ziemlich gut

+3

Das einzige Problem mit dieser Bibliothek ist, dass es nicht zulassen, wird die Ausgabe von CSV-Dateien mit Windows-Zeilen Terminatoren ('\ r \ n') wenn nicht unter Windows läuft. Der Autor hat jahrelang keine Unterstützung geleistet. Ich musste es abzweigen, um dieses fehlende Feature zuzulassen: [JavaCSV 2.2] (https://github.com/pupi1985/JavaCSV-Reloaded) –

2

Das CSV-Format für StringTokenizer leicht genug klingt, aber es kann komplizierter geworden. Hier in Deutschland wird ein Semikolon als Trennzeichen verwendet und Zellen mit Trennzeichen müssen maskiert werden. Sie werden das mit StringTokenizer nicht so einfach handhaben.

ich für http://sourceforge.net/projects/javacsv

6

Für die letzte Unternehmensanwendung gehen würde ich daran gearbeitet benötigt eine beachtliche Menge von CSV zu handhaben - vor ein paar Monaten - ich verwendet SuperCSV bei Sourceforge und fand es einfach, robust und problemlos.

+0

+1 für SuperCSV, aber es hat einige böse Bugs, die noch nicht behoben sind, neu Fehler werden derzeit nicht behandelt und die letzte Version ist fast zwei Jahre alt. Aber wir verwenden eine gepatchte/modifizierte Version in der Produktion ohne Probleme. – MRalwasser

+2

@MRalwasser [Super CSV 2.0.0-Beta-1] (http://supercsv.sourceforge.net/release_notes.html) wurde kürzlich veröffentlicht. Es enthält viele Fehlerbehebungen und neue Funktionen (einschließlich Maven-Unterstützung und eine neue Dozer-Erweiterung für die Zuordnung verschachtelter Eigenschaften und Arrays/Collections) –

+1

@ Hound-Dog Vielen Dank für das Update, ich habe bereits die neue Beta und ich bin froh zu sehen Das Projekt am Leben - obwohl die Häufigkeit der Commits mich immer noch ein bisschen fürchtet (fast alle commits nur an ein paar Tagen). Aber ich werde es mir ansehen. Gibt es ein geschätztes Veröffentlichungsdatum für das Finale 2.0? – MRalwasser

0

Wenn Sie beabsichtigen, CSV von Excel zu lesen, dann gibt es einige interessante Eckfälle. Ich kann mich nicht an alle erinnern, aber die Apache Commons CSV war nicht in der Lage, es richtig zu handhaben (zum Beispiel mit URLs).

Achten Sie darauf, Excel-Ausgabe mit Anführungszeichen und Kommas und Schrägstriche überall zu testen.

80

Ich habe OpenCSV in der Vergangenheit verwendet.

import au.com.bytecode.opencsv.CSVReader;

String fileName = "data.csv"; 
CSVReader reader = new CSVReader(new FileReader(fileName));

// if the first line is the header String[] header = reader.readNext();
// iterate over reader.readNext until it returns null String[] line = reader.readNext();

Es gab einige andere Entscheidungen in den Antworten auf another question.

+0

Leider Der neueste Download von OpenCSV (Version 2.2 zum Zeitpunkt des Kommentars) wird nicht kompiliert, und sie stellen keine vorgefertigte Binärdatei bereit. – opyate

+9

Das Paket, das ich von SourceForge heruntergeladen habe, hatte eine Binärdatei im Deploy-Ordner. –

+8

Wenn Sie maven verwenden, beachten Sie bitte, dass der Abhängigkeitscode auf der offiziellen Website die Versionsdeklaration "2.0" enthält, die einige Fehler enthält, aber es gibt eine aktualisierte Version 2.3 in den Repositories. – broundee

32

Aktualisierung: Der Code in dieser Antwort ist für Super CSV 1.52. Aktualisiert Code-Beispiele für Super CSV 2.4.0 können auf der Projekt-Website: http://super-csv.github.io/super-csv/index.html


Das SuperCSV Projekt unterstützt direkt die Analyse und strukturierte Manipulation von CSV-Zellen. Von http://super-csv.github.io/super-csv/examples_reading.html finden Sie z.B.

eine Klasse

public class UserBean { 
    String username, password, street, town; 
    int zip; 

    public String getPassword() { return password; } 
    public String getStreet() { return street; } 
    public String getTown() { return town; } 
    public String getUsername() { return username; } 
    public int getZip() { return zip; } 
    public void setPassword(String password) { this.password = password; } 
    public void setStreet(String street) { this.street = street; } 
    public void setTown(String town) { this.town = town; } 
    public void setUsername(String username) { this.username = username; } 
    public void setZip(int zip) { this.zip = zip; } 
} 

gegeben und dass Sie eine CSV mit einem Header-Datei.Lassen Sie sich den folgenden Inhalt

username, password, date,  zip, town 
Klaus, qwexyKiks, 17/1/2007, 1111, New York 
Oufu,  bobilop, 10/10/2007, 4555, New York 

annehmen können Sie dann eine Instanz der UserBean erstellen und mit Werten aus der zweiten Zeile der Datei mit dem folgenden Code bevölkern

class ReadingObjects { 
    public static void main(String[] args) throws Exception{ 
    ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE); 
    try { 
     final String[] header = inFile.getCSVHeader(true); 
     UserBean user; 
     while((user = inFile.read(UserBean.class, header, processors)) != null) { 
     System.out.println(user.getZip()); 
     } 
    } finally { 
     inFile.close(); 
    } 
    } 
} 

die folgende „Manipulation Spezifikation verwenden "

final CellProcessor[] processors = new CellProcessor[] { 
    new Unique(new StrMinMax(5, 20)), 
    new StrMinMax(8, 35), 
    new ParseDate("dd/MM/yyyy"), 
    new Optional(new ParseInt()), 
    null 
}; 
+1

Ihr Code würde nicht kompilieren, so dass ich einige Korrekturen eingereicht. Außerdem funktioniert ParseDate() nicht richtig, also habe ich es ersetzt, um einen String zu lesen. Es kann später analysiert werden. –

+1

Große Einschränkung: SuperCSV ist nicht Threadssafe, ich werde nach Jackson suchen, obwohl es mehr Feature-limited sein kann – ZiglioUK

+0

SuperCsv erlaubt auch nicht die Verwendung von Multimaps. Wäre schön zu sehen, dass es mit MultiMaps funktioniert. – Sid

3

Es gibt auch CSV/Excel Utility. Es geht davon aus, dass alle Daten tabellenartig sind und Daten von Iteratoren liefern.

5

Sie CSVReader api & Download zur folgenden Position verwenden können:

http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.zip/download

oder

http://sourceforge.net/projects/javacsv/

Verwenden Sie den folgenden Code ein:

/ ************ For Reading ***************/ 

import java.io.FileNotFoundException; 
import java.io.IOException; 

import com.csvreader.CsvReader; 

public class CsvReaderExample { 

    public static void main(String[] args) { 
     try { 

      CsvReader products = new CsvReader("products.csv"); 

      products.readHeaders(); 

      while (products.readRecord()) 
      { 
       String productID = products.get("ProductID"); 
       String productName = products.get("ProductName"); 
       String supplierID = products.get("SupplierID"); 
       String categoryID = products.get("CategoryID"); 
       String quantityPerUnit = products.get("QuantityPerUnit"); 
       String unitPrice = products.get("UnitPrice"); 
       String unitsInStock = products.get("UnitsInStock"); 
       String unitsOnOrder = products.get("UnitsOnOrder"); 
       String reorderLevel = products.get("ReorderLevel"); 
       String discontinued = products.get("Discontinued"); 

       // perform program logic here 
       System.out.println(productID + ":" + productName); 
      } 

      products.close(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Schreiben/Anfügen an CSV

Code-Datei:

/************* For Writing ***************************/ 

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import com.csvreader.CsvWriter; 

public class CsvWriterAppendExample { 

    public static void main(String[] args) { 

     String outputFile = "users.csv"; 

     // before we open the file check to see if it already exists 
     boolean alreadyExists = new File(outputFile).exists(); 

     try { 
      // use FileWriter constructor that specifies open for appending 
      CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ','); 

      // if the file didn't already exist then we need to write out the header line 
      if (!alreadyExists) 
      { 
       csvOutput.write("id"); 
       csvOutput.write("name"); 
       csvOutput.endRecord(); 
      } 
      // else assume that the file already has the correct header line 

      // write out a few records 
      csvOutput.write("1"); 
      csvOutput.write("Bruce"); 
      csvOutput.endRecord(); 

      csvOutput.write("2"); 
      csvOutput.write("John"); 
      csvOutput.endRecord(); 

      csvOutput.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
19

Lesen CSV-Format Beschreibung mich fühlen lässt, dass 3rd-Party-Bibliothek mit weniger Kopfschmerzen sein würde, als es selbst zu schreiben:

Wikipedia-Listen 10 oder etwas bekannte Bibliotheken:

Ich verglich Libs aufgeführt eine Art Checkliste verwendet wird. OpenCSV stellte sich heraus, einen Sieger zu mir (YMMV) mit den folgenden Ergebnissen:

+ maven 

+ maven - release version // had some cryptic issues at _Hudson_ with snapshot references => prefer to be on a safe side 

+ code examples 

+ open source // as in "can hack myself if needed" 

+ understandable javadoc // as opposed to eg javadocs of _genjava gj-csv_ 

+ compact API // YAGNI (note *flatpack* seems to have much richer API than OpenCSV) 

- reference to specification used // I really like it when people can explain what they're doing 

- reference to _RFC 4180_ support // would qualify as simplest form of specification to me 

- releases changelog // absence is quite a pity, given how simple it'd be to get with maven-changes-plugin // _flatpack_, for comparison, has quite helpful changelog 

+ bug tracking 

+ active // as in "can submit a bug and expect a fixed release soon" 

+ positive feedback // Recommended By 51 users at sourceforge (as of now)