Question
Quelqu'un peut-il recommander une API simple qui me permettra d'utiliser lire un fichier d'entrée CSV, d'effectuer quelques transformations simples, puis de l'écrire?
Un rapide Google a trouvé http://flatpack.sourceforge.net/ un site prometteur.
Je voulais juste vérifier ce que les autres utilisent avant de me connecter à cette API.
La solution
Apache Commons CSV
Découvrez le Apache Common CSV .
Cette bibliothèque lit et écrit plusieurs variantes de CSV. , y compris le standard RFC 4180 . Lit également / écrit les fichiers délimités par des tabulations .
- Excel
- InformixUnload
- InformixUnloadCsv
- MySQL
- Oracle
- PostgreSQLCsv
- PostgreSQLText
- RFC4180
- TDF
Autres conseils
J'ai déjà utilisé OpenCSV .
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();
Il y avait d'autres choix dans les réponses à la question .
Mise à jour: le code dans cette réponse concerne Super CSV 1.52. Des exemples de code mis à jour pour Super CSV 2.4.0 sont disponibles sur le site Web du projet: http://super-csv.github.io/super-csv/index. html
Le projet SuperCSV prend directement en charge l'analyse syntaxique et la manipulation structurée de cellules CSV. De http://super-csv.github.io/super-csv/examples_reading .html vous trouverez par exemple
étant donné une classe
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; }
}
et que vous avez un fichier CSV avec un en-tête. Supposons le contenu suivant
username, password, date, zip, town
Klaus, qwexyKiks, 17/1/2007, 1111, New York
Oufu, bobilop, 10/10/2007, 4555, New York
Vous pouvez ensuite créer une instance de UserBean et la renseigner avec les valeurs de la deuxième ligne du fichier avec le code suivant
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();
}
}
}
en utilisant la "spécification de manipulation" " suivante
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
};
La lecture de la description de format CSV me donne l’impression que l’utilisation d’une bibliothèque tierce causerait moins de maux de tête que de l’écrire moi-même:
Wikipedia répertorie une dizaine de bibliothèques connues:
J'ai comparé les bibliothèques répertoriées à l'aide d'une sorte de liste de contrôle. OpenCSV s’est révélé gagnant (YMMV) avec les résultats suivants:
+ 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)
Nous utilisons JavaCSV , cela fonctionne plutôt bien
Pour la dernière application d'entreprise sur laquelle j'ai travaillé, il fallait traiter une quantité notable de fichiers CSV - il y a quelques mois - j'ai utilisé SuperCSV sur sourceforge et l’a trouvé simple, robuste et sans problème.
Vous pouvez utiliser csvreader api & amp; télécharger à partir de l'emplacement suivant:
ou
http://sourceforge.net/projects/javacsv/
Utilisez le code suivant:
/ ************ 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();
}
}
}
Écrire / ajouter au fichier CSV
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();
}
}
}
Il existe également un utilitaire CSV / Excel . Il suppose que toutes les données sont sous forme de tableau et fournit les données des itérateurs.
Le format CSV semble assez simple pour StringTokenizer, mais il peut devenir plus compliqué. Ici, en Allemagne, un point-virgule est utilisé comme séparateur et les cellules contenant des délimiteurs doivent être protégées. Vous n’allez pas gérer cela aussi facilement avec StringTokenizer.
Je choisirais http://sourceforge.net/projects/javacsv
Si vous avez l’intention de lire csv dans Excel, il existe quelques cas intéressants. Je ne me souviens pas de tous les noms, mais le csv d’apache commons n’était pas capable de le gérer correctement (avec, par exemple, des URL).
Veillez à tester le résultat Excel avec des guillemets, des virgules et des barres obliques.