在java中parsingCSV

我有这个奇怪的情况,我必须水平阅读。 所以我得到一个水平格式的数据的CSV文件。 如下所示:

CompanyName,RunDate,10/27/2010,11/12/2010,11/27/2010,12/13/2010,12/27/2010.... 

RunDate后显示的所有date是运行date字段的值,我必须更新该系统中该公司的字段。 date值不是固定编号,它们可以是单个值到10到n个数字。 所以我需要读取所有这些值并在系统中更新。 我正在用Java写这个。

像OpenCSV这样的库处理CSV文件的所有奇怪情况(新行,分隔符等)。

string,拆分(“,”)不太可能工作。
它将拆分embedded了逗号(“Foo,Inc.”)的字段,即使它们是CSV行中的单个字段。

如果公司名称是:
Company,Inc.
或更糟:
乔的“好,快,廉”食物

根据维基百科:( http://en.wikipedia.org/wiki/Comma-separated_values

embedded逗号的字段必须用双引号括起来。

  1997,Ford,E350,"Super, luxurious truck" 

embedded双引号字符的字段必须用双引号字符括起来,每个embedded的双引号字符必须用一对双引号字符表示。

  1997,Ford,E350,"Super ""luxurious"" truck" 

更糟糕的是,引用的字段可能会embedded换行符(换行符;“\ n”):

带有embedded换行符的字段必须用双引号字符括起来。

  1997,Ford,E350,"Go get one now they are going fast" 

这演示了String,split(“,”)parsing逗号的问题:

CSV行是:

a,b,c,“Company,Inc.”,d,e,“Joe's”,“Good,Fast,and Cheap”,“Food”,f,10/11 / 2010,1 /一世

 // Test String.split(",") against CSV with // embedded commas and embedded double-quotes in // quoted text strings: // // Company names are: // Company, Inc. // Joe's "Good, Fast, and Cheap" Food // // Which should be formatted in a CSV file as: // "Company, Inc." // "Joe's ""Good, Fast, and Cheap"" Food" // // public class TestSplit { public static void TestSplit(String s, String splitchar) { String[] split_s = s.split(splitchar); for (String seg : split_s) { System.out.println(seg); } } public static void main(String[] args) { String csvLine = "a,b,c,\"Company, Inc.\", d," + " e,\"Joe's \"\"Good, Fast," + " and Cheap\"\" Food\", f," + " 10/11/2010,1/1/2011, h, i"; System.out.println("CSV line is:\n" + csvLine + "\n\n"); TestSplit(csvLine, ","); } } 

产生以下内容:

 D:\projects\TestSplit>javac TestSplit.java D:\projects\TestSplit>java TestSplit CSV line is: a,b,c,"Company, Inc.", d, e,"Joe's ""Good, Fast, and Cheap"" Food", f, 10/11/2010,1/1/2011, g, h, i a b c "Company Inc." d e "Joe's ""Good Fast and Cheap"" Food" f 10/11/2010 1/1/2011 g h i D:\projects\TestSplit> 

那个CSV行应该被parsing为:

 a b c "Company, Inc." d e "Joe's ""Good, Fast, and Cheap"" Food" f 10/11/2010 1/1/2011 g h i 

将它们拆分为“,”并对其进行分析,然后使用“列表”来添加所有这些值。

正如其他build议分裂和parsing你可以使用opencsv

使用java.util.Scanner – 可以调用useDelimiter()来使逗号分隔符,并用next()读取新的标记。 扫描仪可以直接从您的文件或从文件中读取的string创build。

CSV文件是\n终止的文件,每列可以通过以下方式分开:

  • 逗号或
  • 标签\t

我build议你有一个读取CSV文件的BufferedReader ,并使用readLine()方法读取该行。

从每一行中,使用String.split(arg) ,其中arg将是您的逗号或制表符\t有一个列数组….从那里,你知道该怎么做。

首先将整行读入string。 然后你使用String.split(…)函数来获取你所使用的分隔符是“,”的行上的所有标记。 (或者当你使用正则expression式时它是“\”)?

到目前为止,我所发现的CSVparsing主题上最有用的页面如下:

http://secretgeek.net/csv_trouble.asp

基本上,得到一个build立的库为你做,因为csvparsing是欺骗性的棘手。

为了一次获得每个值, 使用一个StringTokenizer 。 StringTokenizer(str, ",")构造它。 (不build议)

使用string类的split()方法,将所有的标记加载到一个数组中。

使用DateFormat类来parsing每个date – 特别是DateFormat.parse(String)