Java的CSV API

时间:2020-03-06 14:25:30  来源:igfitidea点击:

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

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

在将自己与该API结合之前,我只想查看其他人正在使用什么。

解决方案

我们使用JavaCSV,效果很好

对于StringTokenizer来说,CSV格式听起来很容易,但可能会变得更加复杂。
在德国,此处使用分号作为分隔符,并且需要对包含分隔符的单元进行转义。我们不会使用StringTokenizer轻松处理该问题。

我会去http://sourceforge.net/projects/javacsv

对于最后一个企业应用程序,我处理了需要处理大量CSV的应用程序-几个月前-我在sourceforge上使用了SuperCSV,发现它简单,健壮且没有问题。

如果我们打算从excel中读取csv,则有一些有趣的特殊情况。我记不清所有内容,但是apache commons csv无法正确处理它(例如,使用url)。

确保在各处使用引号,逗号和斜杠测试excel输出。

从apache中检查一个。

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

另一个问题的答案中还有其他选择。

更新:此答案中的代码适用于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
};

还有CSV / Excel实用程序。它假定所有数据都是表格形式的,并从Iterators传递数据。