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.
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:
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.