it-swarm.com.de

CSV-API für Java

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

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

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

161
David Turner

Apache Commons CSV

Check out Apache Common CSV .

Diese Bibliothek liest und schreibt verschiedene Varianten von CSV , einschließlich der Standardbibliothek RFC 418 . Liest/schreibt auch tabulatorgetrennte Dateien.

  • Excel
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Orakel
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF
29
java

Ich habe OpenCSV in der Vergangenheit verwendet.

import au.com.bytecode.opencsv.CSVReader;
String fileName = "data.csv"; 
 CSVReader reader = neuer CSVReader (neuer FileReader (fileName)); 
 

// wenn die erste Zeile der Header ist String [] header = reader.readNext ();
// über reader.readNext iterieren, bis null zurückgegeben wird String [] line = reader.readNext ();

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

83
Jay R.

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. Von 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 folgendem 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
};
32
kbg

Wenn ich die Beschreibung des CSV-Formats lese, habe ich das Gefühl, dass die Verwendung von Bibliotheken von Drittanbietern weniger Kopfschmerzen bereitet als das Schreiben selbst:

Wikipedia listet 10 oder etwas bekannte Bibliotheken auf:

Ich habe die aufgelisteten Bibliotheken anhand einer Checkliste verglichen. OpenCSV ist mir ein Gewinner (YMMV) mit den folgenden Ergebnissen geworden:

+ 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)
18
gnat

Wir verwenden JavaCSV , es funktioniert ziemlich gut

8
Mat Mannion

Bei der letzten Unternehmensanwendung, an der ich gearbeitet habe, musste eine beachtliche Menge an CSV verarbeitet werden - vor ein paar Monaten -. Ich habe SuperCSV bei sourceforge verwendet und fand es einfach, robust und problemlos.

6
Cheekysoft

Sie können csvreader api & download von folgendem Ort verwenden:

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

    }
}
5
Dhananjay Joshi

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

3
Frank

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

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

2
paul

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, damit richtig umzugehen (zum Beispiel mit URLs).

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

0
daveb