CSV API für Java [geschlossen]

164

Kann mir jemand eine einfache API empfehlen, mit der ich eine CSV-Eingabedatei lesen, einige einfache Transformationen durchführen und sie dann schreiben kann?

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

Ich wollte nur überprüfen, was andere verwenden, bevor ich mich mit dieser API kopple.

David Turner
quelle
Verwenden Sie die Schwestersite Software Recommendations Stack Exchange, wenn Sie nach Vorschlägen für eine Softwarebibliothek fragen. Hat mehrere Treffer für Java & CSV .
Basil Bourque

Antworten:

32

Apache Commons CSV

Schauen Sie sich Apache Common CSV an .

Diese Bibliothek liest und schreibt verschiedene Varianten von CSV , einschließlich des Standard- RFC 4180 . Liest / schreibt auch tabulatorgetrennte Dateien.

  • Excel
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Orakel
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF
Basil Bourque
quelle
Ich habe die Sandbox Commons CSV schon seit einiger Zeit verwendet und nie ein Problem festgestellt. Ich hoffe wirklich, dass sie es zum vollen Ansehen befördern und es aus dem Sandkasten holen.
Alex Marshall
3
@ bmatthews68 der Sandbox-Link ist nicht mehr vorhanden - es sieht so aus, als wäre er in Apache Commons verschoben worden (ich habe den Link auch in der Antwort bearbeitet)
drevicko
Apache Commons Beispiele hier: apisonar.com/java-examples/org.apache.commons.csv.html
APISonar
83

Ich habe in der Vergangenheit OpenCSV verwendet .

import au.com.bytecode.opencsv.CSVReader;

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

// wenn die erste Zeile der Header ist String [] header = reader.readNext ();
// iteriere über reader.readNext bis es null zurückgibt String [] line = reader.readNext ();

Bei den Antworten auf eine andere Frage gab es einige andere Möglichkeiten .

Jay R.
quelle
Leider wird der neueste Download von OpenCSV (v2.2 zum Zeitpunkt des Kommentars) nicht kompiliert und es wird keine vorgefertigte Binärdatei bereitgestellt.
Opyate
9
Das Paket, das ich von SourceForge heruntergeladen habe, hatte eine Binärdatei im Bereitstellungsordner.
Mike Sickler
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, die Version 2.3 jedoch in den Repositorys aktualisiert ist.
Broundee
Diese Bibliothek schreibt keine Datei in einem separaten Thread, nein?
Ewoks
3
laut github.com/uniVocity/csv-parsers-comparison durchschnittlich 73% langsamer als uniVocity ..
Ewoks
32

Update: Der Code in dieser Antwort ist für Super CSV 1.52. Aktualisierte Codebeispiele für Super CSV 2.4.0 finden Sie auf der Projektwebsite: http://super-csv.github.io/super-csv/index.html


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

eine Klasse gegeben

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; }
}

und dass Sie eine CSV-Datei mit einem Header haben. Nehmen wir den folgenden Inhalt an

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

Anschließend können Sie eine Instanz der UserBean erstellen und diese mit Werten aus der zweiten Zeile der Datei mit dem folgenden Code füllen

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();
    }
  }
}

unter Verwendung der folgenden "Manipulationsspezifikation"

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
};
kbg
quelle
1
Ihr Code wurde nicht kompiliert, daher habe ich einige Korrekturen eingereicht. Außerdem funktioniert ParseDate () nicht richtig, daher habe ich es ersetzt, um einen String zu lesen. Es kann später analysiert werden.
1
Große Einschränkung: SuperCSV ist nicht threadsicher, ich werde mich an Jackson wenden, obwohl es möglicherweise mehr
funktionsbeschränkt ist
SuperCsv erlaubt auch nicht die Verwendung von Multimaps. Wäre schön zu sehen, dass es mit MultiMaps funktioniert.
Sid
19

Wenn ich die Beschreibung des CSV-Formats lese, habe ich das Gefühl, dass die Verwendung einer Bibliothek eines Drittanbieters weniger Kopfschmerzen verursacht als das Schreiben selbst:

Wikipedia listet 10 oder etwas Bekanntes auf:

Ich habe die aufgelisteten Bibliotheken anhand einer Checkliste verglichen. OpenCSV war für mich (YMMV) ein Gewinner mit 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)
Mücke
quelle
8

Wir verwenden JavaCSV , es funktioniert ziemlich gut

Mat Mannion
quelle
3
Das einzige Problem mit dieser Bibliothek ist, dass Sie keine CSV-Dateien mit Windows-Zeilenabschlusszeichen ( \r\n) ausgeben können, wenn Sie nicht unter Windows ausgeführt werden. Der Autor hat jahrelang keine Unterstützung geleistet. Ich musste es gabeln, um diese fehlende Funktion zuzulassen
Mosty Mostacho
6

Für die letzte Unternehmensanwendung, an der ich gearbeitet habe, um eine bemerkenswerte Menge an CSV zu verarbeiten - vor ein paar Monaten - habe ich SuperCSV bei sourceforge verwendet und fand es einfach, robust und problemlos.

Cheekysoft
quelle
+1 für SuperCSV, aber es gibt einige böse Fehler, die noch nicht behoben sind, neue Fehler werden derzeit nicht behandelt und die letzte Version ist fast zwei Jahre alt. Wir verwenden jedoch problemlos eine gepatchte / modifizierte Version in der Produktion.
MRalwasser
2
@MRalwasser Super CSV 2.0.0-beta-1 wurde kürzlich veröffentlicht. Es enthält viele Fehlerkorrekturen und neue Funktionen (einschließlich Maven-Unterstützung und einer neuen Dozer-Erweiterung für die Zuordnung verschachtelter Eigenschaften und Arrays / Sammlungen)
James Bassett
1
@ Hound-Dog Vielen Dank für das Update, ich habe die neue Beta bereits bemerkt und bin froh, das Projekt lebend zu sehen - obwohl mir die Häufigkeit der Commits immer noch ein wenig Angst macht (fast alle Commits nur an wenigen Tagen). Aber ich werde einen Blick darauf werfen. Gibt es ein voraussichtliches Veröffentlichungsdatum für das endgültige 2.0?
MRalwasser
2
@MRalwasser Ich bin im Moment der einzige Entwickler und habe Vollzeitarbeit, daher arbeite ich immer daran, wenn ich ein freies Wochenende bekomme - daher die sporadischen Commits :) Fast 1000 SF-Downloads der Beta jetzt und keine Fehler, Ich freue mich also auf eine endgültige Veröffentlichung Anfang nächsten Monats. Wenn Sie Ideen für zukünftige Funktionen haben, teilen Sie uns dies bitte mit.
James Bassett
1
SuperCSV ist zu diesem Zeitpunkt nicht threadsicher, was es imho nicht wirklich robust macht
ZiglioUK
5

Sie können csvreader api verwenden und von folgendem Speicherort herunterladen:

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:

/ ************ 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 / Anhängen an CSV-Datei

Code:

/************* 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();
        }

    }
}
Dhananjay Joshi
quelle
3

Es gibt auch das CSV / Excel-Dienstprogramm . Es wird davon ausgegangen, dass alle diese Daten tabellenartig sind und Daten von Iteratoren liefern.

Frank
quelle
2

Das CSV-Format klingt für StringTokenizer recht einfach, kann jedoch komplizierter werden. Hier in Deutschland wird ein Semikolon als Begrenzer verwendet und Zellen, die Begrenzer enthalten, müssen maskiert werden. Mit StringTokenizer werden Sie nicht so einfach damit umgehen.

Ich würde für http://sourceforge.net/projects/javacsv gehen

paul
quelle
0

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

Stellen Sie sicher, dass Sie die Excel-Ausgabe überall mit Anführungszeichen, Kommas und Schrägstrichen testen.

Daveb
quelle
Die Apache Commons CSV- Bibliothek bietet eine spezielle Variante für Microsoft Excel . Ich weiß nicht, ob das jetzt die von Ihnen erwähnten Probleme behandelt oder nicht.
Basil Bourque