用于Java的CSV API

任何人都可以推荐一个简单的API,使我可以使用读取CSVinput文件,做一些简单的转换,然后写下来。

快速谷歌已经findhttp://flatpack.sourceforge.net/看起来很有前途。

我只是想在查看这个API之前查看其他人正在使用的内容。

Apache Commons CSV

从apache检查一个。

我以前使用OpenCSV 。

import au.com.bytecode.opencsv.CSVReader; 

  String fileName =“data.csv”;
 CSVReader reader = new CSVReader(new FileReader(fileName)); 

//如果第一行是标题
String [] header = reader.readNext();
//遍历reader.readNext,直到它返回null
String [] line = reader.readNext();

另外一个问题的答案还有其他的select。

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


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

给一个class

 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 

然后,您可以创build一个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格式的描述使我觉得使用第三方库不会比自己写的头疼:

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

我比较使用某种检查列表列出的libs。 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) 

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

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

您可以使用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(); } } } 

还有CSV / Excel实用程序 。 它假设所有的数据都是表格式的,并从迭代器传递数据。

对于StringTokenizer而言,CSV格式听起来很容易,但它可能变得更加复杂。 在德国,分号用作分隔符,包含分隔符的单元格需要被转义。 你不会用StringTokenizer轻松处理。

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

如果你打算从excel中读取csv,那么有一些有趣的angular落案例。 我不记得所有的,但Apache的公共csv不能正确处理它(例如,url)。

一定要用引号,逗号和斜杠来testingexcel输出。

使用

String [] myValues = String.split(“,”);