当前位置:  开发笔记 > 编程语言 > 正文

适用于Java的CSV API

如何解决《适用于Java的CSVAPI》经验,为你挑选了7个好方法。

任何人都可以推荐一个简单的API,允许我使用读取CSV输入文件,做一些简单的转换,然后写它.

一个快速的谷歌发现http://flatpack.sourceforge.net/看起来很有希望.

我只想在结合这个API之前检查其他人正在使用的内容.



1> Jay R...:

我过去使用过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();

在另一个问题的答案中还有其他一些选择.


我从SourceForge下载的软件包在deploy文件夹中有一个二进制文件.
如果你正在使用maven,请注意官方网站上的依赖代码包含版本声明"2.0",它有一些错误,但在存储库中有更新版本2.3.
根据https://github.com/uniVocity/csv-parsers-比较平均比uniVocity慢73%..

2> 小智..:

更新:此答案中的代码适用于Super CSV 1.52.可以在项目网站上找到Super CSV 2.4.0的更新代码示例:http: //super-csv.github.io/super-csv/index.html


SuperCSV项目直接支持CSV单元的解析和结构化操作.从http://super-csv.github.io/super-csv/examples_reading.html你会发现例如

给一堂课

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

并且您有一个带有标题的CSV文件.我们假设以下内容

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

然后,您可以创建UserBean的实例,并使用以下代码使用文件第二行的值填充它

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

使用以下"操作规范"

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



3> 小智..:
Apache Commons CSV

查看Apache Common CSV.

该库读取和写入CSV的几种变体,包括标准的RFC 4180.还读取/写入制表符分隔的文件.

高强

InformixUnload

InformixUnloadCsv

MySQL的

神谕

PostgreSQLCsv

PostgreSQLText

RFC4180

TDF


@ bmatthews68沙箱链接已经不存在 - 看起来好像被移到[apache commons proper](http://commons.apache.org/proper/commons-csv/)(我在答案中也编辑了链接)

4> gnat..:

阅读CSV格式的描述让我觉得使用第三方库比自己写的要少:

http://en.wikipedia.org/wiki/Comma-separated_values

维基百科列出了10个或者已知的库:

http://en.wikipedia.org/wiki/CSV_application_support

我比较了使用某种检查列表列出的库.OpenCSV对我来说是一个胜利者(YMMV),结果如下:

+ 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)



5> Mat Mannion..:

我们使用JavaCSV,它运行得很好


此库的唯一问题是,当不在Windows上运行时,它不允许您使用Windows行终止符(`\ r \n`)输出CSV文件.多年来,作者一直没有提供支持.我不得不分叉它以允许缺少这个功能:[JavaCSV 2.2](https://github.com/pupi1985/JavaCSV-Reloaded)

6> Cheekysoft..:

对于我工作的最后一个需要处理大量CSV的企业应用程序 - 几个月前 - 我在sourceforge 使用了SuperCSV,发现它简单,强大且无问题.


@MRalwasser [Super CSV 2.0.0-beta-1](http://supercsv.sourceforge.net/release_notes.html)最近发布.它包含许多错误修复和新功能(包括Maven支持和用于映射嵌套属性和数组/集合的新Dozer扩展)
@MRalwasser我是目前唯一的开发人员并且有全职工作,所以每当我获得一个免费的周末时我都倾向于这个工作 - 因此零星的提交:)现在有近1000个SF下载的测试版,没有错误,因此,看看下个月初的最终版本.如果您对未来功能有任何想法,请告诉我们.

7> Dhananjay Jo..:

您可以使用csvreader api并从以下位置下载:

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

要么

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

使用以下代码:

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

码:

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

    }
}

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有