Java的CSV API
任何人都可以推荐一个简单的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传递数据。