在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 。 用 (不build议) StringTokenizer(str, ",")
构造它。
使用string类的split()
方法,将所有的标记加载到一个数组中。
使用DateFormat类来parsing每个date – 特别是DateFormat.parse(String)
。