2010-10-11 55 views
5

我有這種奇怪的情況,我必須水平閱讀。所以我得到一個有水平格式數據的csv文件。如下圖所示:RunDate後顯示解析java中的CSV

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

所有日期是運行日期字段值,我要更新我的系統爲這家公司該領域。日期值不是固定編號,它們可以是單個值到10到n數。所以我需要讀取所有這些值並在系統中更新。我正在用Java寫這篇文章。

+0

不像你想象的那樣奇怪:) – 2010-10-11 16:25:51

+0

像[OpenCSV](http://opencsv.sourceforge.net/)這樣的庫處理所有奇怪的CSV文件(新行,分隔符等)情況。 – Joshua 2010-10-11 16:32:11

+0

即使不存在「怪異」情況,使用庫會(1)減少解析錯誤的可能性; (2)提供更多功能; (3)產生可擴展的解決方案;和(4)很容易整合未來CSV文件的解析(如果需要的話)。 – 2010-10-11 16:38:39

回答

4

將它們拆分爲「,」並解析它,並使用列表添加所有這些值。

至於其他已經提示了拆分和解析,你可以通過閱讀整條生產線爲一個字符串使用opencsv

+0

-1這不會處理字段中帶有逗號的字段,這是完全有效的CSV。分裂「,」在一個簡單的情況下工作,但只是偶爾在一個現實的情況下工作。 – 2010-10-11 16:48:29

+0

@Dave DeLong你能否詳述一下你的評論 – 2010-10-11 16:49:47

+0

life.java考慮一下這個csv行:''你好,「,我的名字是Dave'。它有5個字段:'你好,'和'我''和'名字'和'是'和'Dave'。你的建議會產生6:''你好'''','''''','''''',''''和'戴夫' – 2010-10-11 16:51:27

1

你開始。然後使用String.split(...)函數獲取所用分隔符所在行的所有標記爲「,」。 (或者當你使用正則表達式時它是「\,」)

+0

你可以調用'String.split(「,」)'。 – 2010-10-11 16:23:23

+0

謝謝,我會盡量記住,我很少使用正則表達式。 – camickr 2010-10-11 17:12:04

1

爲了一次獲得一個值,使用StringTokenizer。用StringTokenizer(str, ",")構建它。(不推薦)

使用字符串類的split()方法,該方法將所有的標記加載到數組中。

使用DateFormat類來解析每個日期 - 特別是DateFormat.parse(String)

+1

來自'StringTokenizer'的api:StringTokenizer是一個遺留類,爲了兼容性原因被保留,儘管它在新代碼中的使用不受歡迎。建議任何尋求此功能的人使用String或java.util.regex包的拆分方法。 – Qwerky 2010-10-11 16:31:40

+0

:尷尬:我可能應該在我推薦答案之前查閱文檔。 <編輯答案反映新知> – 2010-10-11 16:36:31

+0

@Qwerky - 我討厭他們扔掉了一個完美的課堂 - 但你是對的。 – KevinDTimm 2010-10-11 16:38:16

2

使用java.util.Scanner - 您可以調用useDelimiter()以逗號作爲分隔符,並使用next()讀取新的標記。掃描儀可以直接從您的文件或從文件讀取的字符串創建。

2

CSV文件是每列可以被分隔或者由\n終止文件:

  • 逗號或
  • 標籤\t

我建議你有一個BufferedReader,讀取CSV文件並使用readLine()方法讀取該行。

從每一行中,使用String.split(arg)其中arg將是您的逗號或選項卡\t有一個列的數組....從那裏,你知道該怎麼做。

+0

CSV中的'C'代表逗號 - google代表'TSV'代表「Tab分隔值」 – 2010-10-11 22:36:17

+0

@Stephen P的確,但是阻止任何人將標籤放入CSV文件? – 2010-10-12 05:50:45

1

到目前爲止,在我曾經發現CSV解析這一主題的最有用的頁面如下:

http://secretgeek.net/csv_trouble.asp

基本上,得到一個建立庫爲你做它,因爲CSV解析是看似棘手。

+0

一點都不棘手....這是一個簡單的逗號或製表符分隔的文件。 – 2010-10-11 17:39:17

+0

@The Elite - 沒有閱讀發佈的文章,是嗎? – KevinDTimm 2010-10-11 18:21:50

+0

我現在做了....如果馬科斯能做到這一點,任何人都可以...... *諷刺笑* – 2010-10-11 18:34:32

7

字符串,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 
+0

很高興提供演示代碼。 – 2010-10-11 22:39:06

+0

謝謝!很高興這樣做! – 2010-10-12 04:52:35

0

你確實應該嘗試 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許可證)。