10 Domanda: API CSV per Java [chiuso]

domanda creata a Mon, May 21, 2012 12:00 AM

Qualcuno può raccomandare una semplice API che mi permetta di usare leggere un file di input CSV, fare alcune semplici trasformazioni e poi scriverlo.

Un rapido google ha trovato http://flatpack.sourceforge.net/ che sembra promettente.

Volevo solo verificare cosa stanno utilizzando gli altri prima di associarmi a questa API.

    
161
  1. Usa il sito affiliato Scambio di stack di raccomandazioni software quando si richiedono suggerimenti su una libreria software. Ha diversi successi per Java & CSV .
    2019-01-06 22: 28: 18Z
10 risposte                              10                         

Apache Commons CSV

Controlla CSV comune di Apache .

Questa libreria legge e scrive diverse varianti di CSV , incluso quello standard RFC 4180 . Inoltre legge /scrive file delimitati da tabulazioni .

  • Excel
  • InformixUnload
  • InformixUnloadCsv
  • MySQL
  • Oracle
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF
29
2019-01-06 22: 32: 24Z
  1. Ho usato il CSV Commons sandboxed per un po 'di tempo e non ho mai avuto problemi. Spero davvero che lo promuovano a pieno ritmo e lo tirino fuori dalla sandbox.
    2010-12-14 19: 38: 04Z
  2. @ bmatthews68 il link sandbox è defunct - sembra che sia stato spostato su apache commons proper (Ho modificato anche il link nella risposta)
    2013-06-15 07: 50: 53Z

Ho usato OpenCSV in passato.

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

C'erano altre scelte nelle risposte a un'altra domanda .

    
82
2017-05-23 12: 26: 00Z
  1. Sfortunatamente, l'ultimo download di OpenCSV (v2.2 al momento del commento) non viene compilato e non forniscono un binario precostruito.
    2011-03-21 21: 24: 17Z
  2. Il pacchetto che ho scaricato da SourceForge aveva un file binario nella cartella di distribuzione.
    2011-06-01 02: 29: 22Z
  3. Se stai usando maven, tieni presente che il codice di dipendenza sul sito web ufficiale contiene la dichiarazione di versione "2.0" che ha alcuni bug, ma c'è una versione aggiornata 2.3 nei repository .
    2012-07-16 06: 15: 53Z
  4. questa lib non scrive file in thread separati, no?
    2014-10-09 20: 04: 26Z
  5. in base a github.com/uniVocity /csv-parsers-comparison in media del 73% più lento di uniVocity ..
    2015-09-17 13: 39: 34Z

Aggiornamento: il codice in questa risposta è per Super CSV 1.52. Esempi di codice aggiornati per Super CSV 2.4.0 sono disponibili sul sito Web del progetto: http://super-csv.github.io/super-csv/index. html


Il progetto SuperCSV supporta direttamente l'analisi e la manipolazione strutturata delle celle CSV. Da http://super-csv.github.io/super-csv/examples_reading .html troverai ad es

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

e che hai un file CSV con un'intestazione. Supponiamo che il seguente contenuto

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

È quindi possibile creare un'istanza di UserBean e popolarla con valori dalla seconda riga del file con il seguente codice

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

utilizzando la seguente "specifica di manipolazione"

 
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
2016-04-23 04: 32: 10Z
  1. Il tuo codice non verrebbe compilato, quindi ho inviato alcune correzioni. Inoltre, ParseDate () non funziona correttamente, quindi l'ho sostituito per leggere una stringa. Può essere analizzato in un secondo momento.
    2012-07-01 18: 31: 56Z
  2. Grande limitazione: SuperCSV non è thread-safe, ho intenzione di guardare a Jackson, anche se potrebbe essere più limitato di funzionalità
    2014-02-04 04: 11: 42Z
  3. Anche SuperCsv non consente l'utilizzo di multimaps. Sarebbe bello vederlo funzionare con MultiMaps.
    2016-04-16 09: 02: 54Z

La lettura della descrizione del formato CSV mi fa pensare che l'utilizzo di una libreria di terze parti sia meno fastidioso che scrivere da solo:

Wikipedia elenca 10 o librerie conosciute:

Ho confrontato le librerie elencate usando una sorta di lista di controllo. OpenCSV ha ottenuto un vincitore per me (YMMV) con i seguenti risultati:

 
+ 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)
    
17
2017-02-17 11: 02: 58Z

Utilizziamo JavaCSV , funziona abbastanza bene

    
8
2008-09-19 11: 06: 56Z
  1. L'unico problema con questa libreria è che non consente di generare file CSV con terminatori di riga Windows (\r\n) quando non sono in esecuzione su Windows. L'autore non ha fornito supporto per anni. Ho dovuto biforcare per consentire quella caratteristica mancante: JavaCSV 2.2
    2013-09-23 20: 42: 32Z

Per la lHo lavorato su un'applicazione enterprise che aveva bisogno di gestire una notevole quantità di CSV - un paio di mesi fa - Ho usato SuperCSV su sourceforge e l'ho trovato semplice, robusto e senza problemi.

    
6
2008-09-19 11: 21: 08Z
  1. + 1 per SuperCSV, ma ha alcuni bug sgradevoli che non sono ancora stati corretti, i nuovi bug non sono gestiti attualmente e l'ultima versione ha quasi due anni . Ma stiamo usando una versione modificata /modificata in produzione senza problemi.
    2010-07-13 09: 39: 57Z
  2. @ MRalwasser Super CSV 2.0.0-beta -1 è stato recentemente rilasciato. Include molte correzioni di bug e nuove funzionalità (incluso il supporto di Maven e una nuova estensione di Dozer per la mappatura di proprietà e array /raccolte annidate)
    2012-10-16 02: 39: 45Z
  3. @ Hound-Dog Grazie per l'aggiornamento, ho già notato la nuova beta e sono contento di vedere il progetto vivo - anche se la frequenza dei commit mi teme ancora un po '(quasi tutti i commit solo in pochi giorni). Ma darò un'occhiata. Esiste una stima della data di rilascio dell'ultimo 2.0?
    2012-10-16 06: 31: 32Z
  4. @ MRalwasser Sono l'unico dev al momento e lavoro a tempo pieno, quindi tendo a lavorare su questo ogni volta che ottengo un weekend gratis - da qui il commit sporadico :) Quasi 1000 download SF della beta ora, e nessun bug, quindi guardiamo in pista per un rilascio finale all'inizio del prossimo mese. Se hai qualche idea per le funzionalità future, faccelo sapere.
    2012-10-16 07: 15: 28Z
  5. SuperCSV non è thread-safe in questa fase, che lo rende non molto robusto imho
    2014-02-04 04: 13: 00Z

Puoi usare csvreader api & scarica dal seguente percorso:

http://sourceforge.net/progetti /javacsv /files /JavaCsv /JavaCsv% 202,1 /javacsv2.1.zip /scaricare

o

http://sourceforge.net/projects/javacsv/

Utilizza il seguente codice:

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

    }

}

Scrivi /Accoda al file CSV

Codice:

 
/************* 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
2011-06-22 10: 45: 05Z

C'è anche Utilità CSV /Excel . Si presuppone che tutti i dati siano simili a tabelle e forniscano dati da Iterators.

    
3
2010-10-06 07: 47: 30Z

Il formato CSV sembra abbastanza facile per StringTokenizer, ma può diventare più complicato. Qui in Germania viene utilizzato un punto e virgola come delimitatore e le celle contenenti delimitatori devono essere sfuggite. Non lo gestirai facilmente con StringTokenizer.

Vorrei andare per http://sourceforge.net/projects/javacsv

    
2
2012-12-19 15: 10: 19Z

Se intendi to leggi csv da excel, poi ci sono alcuni casi d'angolo interessanti. Non riesco a ricordarli tutti, ma il comando apache csv non era in grado di gestirlo correttamente (con, ad esempio, gli URL).

Assicurati di testare l'output di Excel con virgolette, virgole e barre ovunque.

    
0
2008-09-19 11: 37: 05Z
  1. Il Apache Commons La libreria CSV offre una variante specifica per Microsoft Excel . Non so se questo ora gestisce i problemi che hai menzionato o meno.
    2019-01-06 22: 22: 53Z
fonte posta Qui