我有這種奇怪的情況,我必須水平閱讀。所以我得到一個有水平格式數據的csv文件。如下圖所示:RunDate後顯示解析java中的CSV
CompanyName,RunDate,10/27/2010,11/12/2010,11/27/2010,12/13/2010,12/27/2010....
所有日期是運行日期字段值,我要更新我的系統爲這家公司該領域。日期值不是固定編號,它們可以是單個值到10到n數。所以我需要讀取所有這些值並在系統中更新。我正在用Java寫這篇文章。
我有這種奇怪的情況,我必須水平閱讀。所以我得到一個有水平格式數據的csv文件。如下圖所示:RunDate後顯示解析java中的CSV
CompanyName,RunDate,10/27/2010,11/12/2010,11/27/2010,12/13/2010,12/27/2010....
所有日期是運行日期字段值,我要更新我的系統爲這家公司該領域。日期值不是固定編號,它們可以是單個值到10到n數。所以我需要讀取所有這些值並在系統中更新。我正在用Java寫這篇文章。
將它們拆分爲「,」並解析它,並使用列表添加所有這些值。
至於其他已經提示了拆分和解析,你可以通過閱讀整條生產線爲一個字符串使用opencsv
-1這不會處理字段中帶有逗號的字段,這是完全有效的CSV。分裂「,」在一個簡單的情況下工作,但只是偶爾在一個現實的情況下工作。 – 2010-10-11 16:48:29
@Dave DeLong你能否詳述一下你的評論 – 2010-10-11 16:49:47
life.java考慮一下這個csv行:''你好,「,我的名字是Dave'。它有5個字段:'你好,'和'我''和'名字'和'是'和'Dave'。你的建議會產生6:''你好'''','''''','''''',''''和'戴夫' – 2010-10-11 16:51:27
你開始。然後使用String.split(...)函數獲取所用分隔符所在行的所有標記爲「,」。 (或者當你使用正則表達式時它是「\,」)
你可以調用'String.split(「,」)'。 – 2010-10-11 16:23:23
謝謝,我會盡量記住,我很少使用正則表達式。 – camickr 2010-10-11 17:12:04
爲了一次獲得一個值,使用StringTokenizer。用(不推薦)StringTokenizer(str, ",")
構建它。
使用字符串類的split()
方法,該方法將所有的標記加載到數組中。
使用DateFormat類來解析每個日期 - 特別是DateFormat.parse(String)
。
來自'StringTokenizer'的api:StringTokenizer是一個遺留類,爲了兼容性原因被保留,儘管它在新代碼中的使用不受歡迎。建議任何尋求此功能的人使用String或java.util.regex包的拆分方法。 – Qwerky 2010-10-11 16:31:40
:尷尬:我可能應該在我推薦答案之前查閱文檔。 <編輯答案反映新知> – 2010-10-11 16:36:31
@Qwerky - 我討厭他們扔掉了一個完美的課堂 - 但你是對的。 – KevinDTimm 2010-10-11 16:38:16
使用java.util.Scanner - 您可以調用useDelimiter()以逗號作爲分隔符,並使用next()讀取新的標記。掃描儀可以直接從您的文件或從文件讀取的字符串創建。
CSV文件是每列可以被分隔或者由\n
終止文件:
\t
我建議你有一個BufferedReader
,讀取CSV文件並使用readLine()
方法讀取該行。
從每一行中,使用String.split(arg)
其中arg
將是您的逗號或選項卡\t
有一個列的數組....從那裏,你知道該怎麼做。
CSV中的'C'代表逗號 - google代表'TSV'代表「Tab分隔值」 – 2010-10-11 22:36:17
@Stephen P的確,但是阻止任何人將標籤放入CSV文件? – 2010-10-12 05:50:45
一點都不棘手....這是一個簡單的逗號或製表符分隔的文件。 – 2010-10-11 17:39:17
@The Elite - 沒有閱讀發佈的文章,是嗎? – KevinDTimm 2010-10-11 18:21:50
我現在做了....如果馬科斯能做到這一點,任何人都可以...... *諷刺笑* – 2010-10-11 18:34:32
字符串,split(「,」)不可能工作。
即使它們是CSV行中的單個字段,它也會拆分包含逗號(「Foo,Inc.」)的字段。
如果公司名稱是:
Company,Inc.的
或者更糟:
喬 「好,速度快,而且價格便宜」食品
根據Wikipedia: (http://en.wikipedia.org/wiki/Comma-separated_values)
的字段嵌入的逗號必須在雙引號字符括起來。
1997,Ford,E350,"Super, luxurious truck"
字段具有嵌入雙引號字符必須在雙引號字符括起來,並且每個嵌入的雙引號字符的必須由一對雙引號字符來表示。
1997,Ford,E350,"Super ""luxurious"" truck"
更糟的是,引用字段可能具有嵌入式換行符(換行符,「\ n」):
領域具有嵌入式換行符必須用雙引號字符括起來。
1997,Ford,E350,"Go get one now they are going fast"
這與字符串,分裂演示該問題( 「」)解析逗號:
的CSV行是:
A,B, c,「Company,Inc.」,d,e,「Joe's」,「Good,Fast,and Cheap」「Food」,f,10/11/2010,1/1/2011,g,h,i
// 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線應被解析爲:
a
b
c
"Company, Inc."
d
e
"Joe's ""Good, Fast, and Cheap"" Food"
f
10/11/2010
1/1/2011
g
h
i
很高興提供演示代碼。 – 2010-10-11 22:39:06
謝謝!很高興這樣做! – 2010-10-12 04:52:35
你確實應該嘗試 univocity-parsers爲CSV解析器有很多功能來處理極端情況的各種(轉義引號,混線分隔符,BOM編碼的文件,等等),這也是fastest CSV libraries周圍之一。
簡單的例子來解析文件:
CsvParserSettings settings = new CsvParserSettings(); //heaps of options here, check the docs
CsvParser parser = new CsvParser(settings);
//loads everything into memory, simple but can be slow.
List<String[]> allRows = parser.parseAll(new File("/path/to/your.csv"));
//parse iterating over each row
for(String[] row : parser.iterate(new File("/path/to/your.csv"))){
//process row here
}
//and many other possibilities: Java bean processing, column selection, format detection, etc.
披露:我是這個庫的作者。它是開放源代碼和免費的(Apache V2.0許可證)。
不像你想象的那樣奇怪:) – 2010-10-11 16:25:51
像[OpenCSV](http://opencsv.sourceforge.net/)這樣的庫處理所有奇怪的CSV文件(新行,分隔符等)情況。 – Joshua 2010-10-11 16:32:11
即使不存在「怪異」情況,使用庫會(1)減少解析錯誤的可能性; (2)提供更多功能; (3)產生可擴展的解決方案;和(4)很容易整合未來CSV文件的解析(如果需要的話)。 – 2010-10-11 16:38:39