2014-01-08 34 views
3

我有一個Java方法,它接收一個CSV字符串的值和一個整數索引,以引用要解析的CSV字符串中的哪一列。該方法返回與CSV字符串中的整數索引關聯的值。如何使用jackson CsvMapper或其他csv解析器解析CSV字符串中的列?

例如,如果我有一個CSV串報頭和第二行與值定義爲:

String csvString = "Entry #,Date Created,Date Updated, IP Address 
        165,8/22/13 14:46,,11.222.33.444"; 

和爲1的方法接收的整數索引,我期望該方法返回字符串「165」

如果通過該方法獲得的整數指數爲2,我期望該方法返回的字符串「13年8月22日14:46」

等,...

我不想只用逗號分割CSV字符串,因爲這可能會變得很難看,我確信有一個CSV解析器已經做了一些這樣的解析。從我的Google搜索中,聽起來像OpenCSV或Jackson CsvMapper可以做到這一點。

我一直在玩的com.fasterxml.jackson.dataformat.csv.CsvMapper libary分析出這個CSV字符串的合適的欄目,這裏是我到目前爲止有:

int csvFieldIndex (this is the integer index passed into my method) 

String csvString = "Entry #,Date Created,Date Updated, IP Address 
        165,8/22/13 14:46,,11.222.33.444"; 

CsvSchema csvSchema = CsvSchema.emptySchema().withHeader(); 
ObjectReader mapper = new CsvMapper().reader(Map.class).with(csvSchema); 

MappingIterator<Map<String, Object>> iter = null; 
iter = mapper.readValues(csvString); 

while (iter.hasNext()) { 
    Map<String, Object> row = iter.next(); 

    System.out.Println("row= " + row.toString()); 
} 

但這迭代器給我所有的csv值,這不是我想要的;我只想要一個與我的整數索引相關的值。

這裏的輸出我得到的,當我運行該代碼片段:

row= {Entry #=165, Date Created=8/22/13 14:46, Date Updated=, IP Address=11.222.33.444} 

有沒有一種方法,我可以使用傑克遜CsvMapper做到這一點?

======== UPDATE:======

基於從keshlam我能夠從一個CSV解析一列用下面的代碼反饋:

CsvSchema csvSchema = CsvSchema.emptySchema().withHeader(); 
ObjectReader mapper = new CsvMapper().reader(Map.class).with(csvSchema); 
MappingIterator<Map<String, Object>> iter = null; 
iter = mapper.readValues(csvString); 

// iterate over whole csv and store in a map 
Map<String, Object> row = null; 
while (iter.hasNext()) { 
    row = iter.next(); 
} 

// now put the set of field names (keys) from this map into an array 
String[] csvKeysArray = row.keySet().toArray(new String[0]); 

int j = 0; 
// loop over this array of keys and compare with csvFieldIndex 
for (int i = 0; i < csvKeysArray.length; i++) { 
    // increment j by 1 since array index starts at 0 but input index starts at 1 
    j = i + 1; 

    if (j == csvFieldIndex) { 
     csvValue = row.get(csvKeysArray[i]).toString(); 
    } 
} 

return csvValue; 
+0

com.fasterxml.jackson.dataformat.csv.CsvMapper類實際上用於從CSV生成JSON。我認爲這不是你的要求,所以你最好使用OpenCSV – shazin

+0

你有一個如何使用OpenCSV做到這一點的例子嗎? – erj2code

+0

我從這個問題得到了我的查詢答案。 :D謝謝@ erj2code –

回答

1

如果我跟着你在問什麼,以及正確認識你的代碼(我從來沒有使用的CsvMapper),如果您要訪問的列數字,而改變最終環路

while (iter.hasNext()) { 
    Map<String, Object> row = iter.next(); 
    System.out.Println("Entry #= " + row.get("Entry #"); 
    } 

比名字(爲什麼?),設置從數字到列名稱的映射並使用它來檢索傳遞給get()操作的密鑰。

+0

一些不同字段名的CSV字符串將被髮送到這個方法。因此,我沒有計算出所有字段名稱(我不關心它),而是使用數字來計算要返回的CSV字符串的哪個列更容易。 – erj2code

+0

此外,此方法將解析的一些CSV字符串可能有超過100列。 – erj2code

+0

感謝您的反饋。我在上面的標題下添加了我的解決方案======== UPDATE:======== – erj2code