2014-04-11 90 views
-1

有沒有什麼辦法解析CSV文件(可變數量的列)藉助一些CSV解析器(例如SuperCSV)來設置列表<字符串>而不跳過Java中的引號?對於輸入:爪哇:CSV解析器 - 跳過引號

id,name,text,sth 
1,"John","Text with 'c,o,m,m,a,s' and \"",qwerty 
2,Bob,"",,sth 

解析後,我想在設置爲具有相同的文字輸入,而不是

id,name,text,sth 
1,John,Text with 'c,o,m,m,a,s' and \",qwerty 
2,Bob,null,null,sth 

該元素

「約翰」將解析爲字符串「John」(而不是John)

「」 - >「」

,, - >,空,

我已經寫這個here,但我可能並沒有使這個不夠清晰。 我想解析csv文件以設置列表<字符串>,對此做一些操作並打印到stdout,並將它們留在引號中。請幫幫我。

+0

[JAVA中的CSV解析器,字符串中的雙引號(SuperCSV,OpenCSV)]的可能重複(http://stackoverflow.com/questions/23000676/csv-parser-in-java-double-quotes-in-string -supercsv-opencsv) – Raedwald

+1

澄清你原來的問題,而不是再問一遍,但用不同的單詞。 – Raedwald

回答

0

這樣的事情?不使用任何現有的解析器,從頭開始做這件事:

public List<String> parse(String st) { 

    List<String> result = new ArrayList<String>(); 

    boolean inText = false; 
    StringBuilder token = new StringBuilder(); 
    char prevCh = 0; 
    for (int i = 0; i < st.length(); i++) { 
     char ch = st.charAt(i); 
     if (ch == ',' && !inText) { 
      result.add(token.toString()); 
      token = new StringBuilder(); 
      continue; 
     } 
     if (ch == '"' && inText) { 
      if (prevCh == '\\') { 
       token.deleteCharAt(token.length() - 1); 
      } else { 
       inText = false;      
      } 
     } else if (ch == '"' && !inText) { 
       inText = true; 
     } 
     token.append(ch); 
     prevCh = ch; 
    } 
    result.add(token.toString()); 
    return result; 
} 

然後

String st = "1,\"John\",\"Text with 'c,o,m,m,a,s' and \\\"\",qwerty"; 

List<String> result = parse(st); 
System.out.println(result); 

會打印出:

[1, "John", "Text with 'c,o,m,m,a,s' and "", qwerty] 
+0

Goodie,但我想知道是否有可能在SuperCSV或OpenCSV等庫的幫助下做同樣的事情?因爲我沒有在任何地方找到它.. – user3521479

+0

不知道,從來沒有使用過外部庫這麼簡單的任務。 –

0

我用這一個: http://opencsv.sourceforge.net/

而且我對結果非常滿意。我有一堆不同組織的CSV文件(有時候有人會說這些日子裏人們稱之爲什麼類型的東西),我設法爲它設置了閱讀器。但是,我不認爲它會生成逗號,但它會留下空白的地方。由於您可以將整行作爲數組讀取,因此可以迭代它,但在每次迭代之間使用逗號。

查找設置,其中有一堆,包括引號字符。