Frage

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

Ein schnelles Google hat es gefunden http://flatpack.sourceforge.net/ was vielversprechend aussieht.

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

War es hilfreich?

Lösung

Apache Commons CSV

Schauen Sie sich Apache Gemeinsame CSV .

Diese Bibliothek liest und schreibt mehrere Varianten von CSV , einschließlich der Standard eines RFC 4180 . Auch liest / schreibt Tab-separierte Dateien.

  • Excel
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Oracle
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF

Andere Tipps

Ich habe verwendet OpenCSV in der Vergangenheit.

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 Möglichkeiten in den Antworten eine andere Frage .

Update: Der Code in dieser Antwort ist für Super CSV 1.52. Aktualisiert Code-Beispiele für Super CSV 2.4.0 kann 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. Aus http://super-csv.github.io/super-csv/examples_reading .html zB finden

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

, und dass Sie eine CSV mit einem Header-Datei haben. Lassen Sie uns den folgenden Inhalt übernehmen

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

Sie können dann eine Instanz der UserBean erstellen und 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();
    }
  }
}

die folgende "Manipulation Spezifikation" mit

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

Wenn ich die Beschreibung des CSV-Formats lese, habe ich das Gefühl, dass die Verwendung einer Bibliothek eines Drittanbieters weniger Kopfschmerzen bereiten würde, als sie selbst zu schreiben:

Wikipedia listet etwa 10 bekannte Bibliotheken auf:

Ich habe die aufgelisteten Bibliotheken anhand einer Art Checkliste verglichen. OpenCSV hat sich für mich als Gewinner herausgestellt (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)

Wir verwenden JavaCSV , es funktioniert ziemlich gut

Für das letzte Unternehmen Anwendung, die ich gearbeitet, was benötigt eine beachtliche Menge von CSV zu handhaben - ein paar Monaten - ich verwendet SuperCSV bei Source und fand es einfach, robust und problemlos.

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

http://sourceforge.net/ Projekte / 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 / anhängen zu 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();
        }

    }
}

Es gibt auch CSV / Excel-Dienstprogramm . Es übernimmt alle thos Daten tabellenartige und liefert Daten von Iteratoren.

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

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

Wenn Sie beabsichtigen, csv aus Excel zu lesen, dann gibt es einige interessante Ecke Fälle. Ich kann mich nicht erinnern, sie alle, aber die Apache Commons csv war nicht in der Lage es richtig zu handhaben (mit zum Beispiel Urls).

Seien Sie sicher, mit Anführungszeichen und Komma zu testen Excel-Ausgabe und schlitzt ganz über den Platz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top