用于 Java 的 CSV API

有人能推荐一个简单的 API 吗? 它允许我使用读取一个 CSV 输入文件,做一些简单的转换,然后编写它。

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

我只是想在我将自己连接到这个 API 之前检查一下其他人在使用什么。

215945 次浏览

我们使用 JavaCSV,它工作得很好

CSV 格式对于 StringTokenizer 来说听起来很简单,但是它可能会变得更复杂。 在德国,分号用作分隔符,包含分隔符的单元格需要转义。使用 StringTokenizer 不会那么容易处理。

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

对于我开发的上一个需要处理大量 CSV 的企业应用程序(几个月前) ,我在 source ceforge 使用了 超级 CSV,发现它简单、健壮且没有问题。

如果你想从 Excel 中读取 csv,那么有一些有趣的角落案例。我记不全了,但是 apache commons csv 不能正确地处理它(例如,使用 urls)。

一定要用引号、逗号和斜杠来测试 excel 输出。

Apache Commons CSV

看看 Apache Common CSV

这个库读写 CSV 的几种变异,包括标准的 RFC 4180。也读写 标签分隔文件。

  • Excel
  • InformixUnload
  • InformixUnloadCSv
  • MySQL
  • 神使
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • 技术发展局

我以前用过 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();

There were some other choices in the answers to another question.

更新: 这个答案中的代码是针对 Super CSV 1.52的。Super CSV 2.4.0的更新代码示例可以在项目网站上找到: Http://super-csv.github.io/super-csv/index.html


SuperCSV 项目直接支持 CSV 单元的解析和结构化操作。

上课

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 实用程序,它假设所有这些数据都是类似于表的,并从迭代器传递数据。

你可在以下位置使用 csvreader 应用程序接口及下载:

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


}
}

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

维基百科列出了10个或者一些已知的图书馆:

我用核对表比较了下列表。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)