it-swarm-tr.com

Java için CSV API'si

Herkes bir CSV giriş dosyasını okumama, bazı basit dönüşümleri yapmama ve yazmamı sağlayacak basit bir API önerebilir mi?.

Hızlı bir google bulmuş http://flatpack.sourceforge.net/ ki bu umut verici görünüyor.

Sadece kendimi bu API ile birleştirmeden önce başkalarının ne kullandığını kontrol etmek istedim.

161
David Turner

Apache Commons CSV

Check out Apache Common CSV .

Bu kütüphane okur ve yazar standart CSV dahil birkaç tane CSV , RFC 418 . Ayrıca okur/yazar Sekmeyle ayrılmış dosyalar.

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

Geçmişte OpenCSV kullandım.

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

// ilk satır başlık ise String [] başlık = reader.readNext ();
// null döndürene kadar reader.readNext üzerinde yinelenir String [] line = reader.readNext ();

Cevaplarında --- başka bir seçenek daha vardı başka bir sor .

83
Jay R.

Güncelleme: Bu cevaptaki kod Süper CSV 1.52 içindir. Süper CSV 2.4.0 için güncellenmiş kod örnekleri proje web sitesinde bulunabilir: http://super-csv.github.io/super-csv/index.html


SuperCSV projesi, CSV hücrelerinin ayrıştırma ve yapılandırılmış manipülasyonunu doğrudan desteklemektedir. http://super-csv.github.io/super-csv/examples_reading.html örn.

sınıf verildi

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

ve bir başlığa sahip bir CSV dosyanız olduğunu Aşağıdaki içeriği varsayalım

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

Daha sonra UserBean örneğini oluşturabilir ve bunu dosyanın ikinci satırındaki değerlerle aşağıdaki kodla doldurabilirsiniz.

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

aşağıdaki "manipülasyon spesifikasyonunu" kullanarak

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

CSV format tanımını okumak, 3. parti kütüphaneyi kullanmanın kendim yazmaktan daha az baş ağrısı olacağını düşündürüyor:

Wikipedia'da 10 veya bilinen bir kitaplık listeleniyor:

Bir çeşit kontrol listesi kullanarak listelenen libleri karşılaştırdım. OpenCSV aşağıdaki sonuçlarla bana bir kazanan (YMMV) verdi:

+ 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

Kullanıyoruz JavaCSV , oldukça iyi çalışıyor

8
Mat Mannion

Son kurumsal uygulama için, birkaç ay önce kayda değer miktarda CSV ile başa çıkmak için gerekli olan üzerinde çalıştım - sourceforge'da SuperCSV kullandım ve basit, sağlam ve sorunsuz buldum.

6
Cheekysoft

Csvreader api'yi kullanabilir ve aşağıdaki konumdan indirebilirsiniz:

http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.Zip/download

veya

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

Aşağıdaki kodu kullanın:

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

    }

}

CSV dosyasına yaz/ekle

Kod:

/************* 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

Ayrıca CSV/Excel Utility de vardır. Tüm bu verilerin tablo benzeri olduğunu ve İteratörlerden veri ilettiğini varsayar.

3
Frank

CSV formatı StringTokenizer için yeterince kolay geliyor ancak daha karmaşık hale gelebiliyor. Burada Almanya'da bir noktalı virgül ayırıcı olarak kullanılır ve sınırlayıcıları içeren hücrelerin kaçması gerekir. StringTokenizer ile kolayca başa çıkamazsınız.

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

2
paul

Excel'den csv okuma niyetindeyseniz, bazı ilginç köşe vakaları vardır. Hepsini hatırlayamıyorum, ancak Apache commons csv'nin doğru bir şekilde kullanamadığı (örneğin, URL'ler).

Excel çıktısını her yerde tırnak işaretleri ve virgüllerle ve eğik çizgilerle test ettiğinizden emin olun.

0
daveb