2012-03-12 83 views
0

我有一個數據字符串,名爲purchaseData,它被分成與"\n"一致的行和","(以CSV格式)的字段。Java - 將數據分割成二維數組

我如何才能讓一個二維字符串數組,使該數組包含陣列,每個字段。因此,對於String[i][j]i將行值(行的位置)和j將內成爲該領域的地位選定的數據數組(行)。

+4

你嘗試過什麼?我會推薦的是一個嵌入式循環(外部獲取下一行內部獲取該行的字段)。我可以給你的代碼,但我想知道你到目前爲止嘗試過什麼。 – twain249 2012-03-12 19:19:31

回答

2
String str = "YOUR_VERY_LONG_STRING"; 
    String[] lines = str.split("\n"); 
    String[][] linesCsv = new String[lines.length][]; 

    for (int i=0; i<lines.length; i++) { 
     linesCsv[i] = lines[i].split(","); 
    } 
3

您可以用String#分裂創建二維數組是這樣的:

String str = "a,b,c,d,e,f\ng,h,i,j,k,l\nm,n,o,p,q,r"; 
String[] arr = str.split("\n"); 
String[][] csv = new String[arr.length][]; 
for(int r=0; r<arr.length; r++) 
    csv[r] = arr[r].split(","); 

更新:由於最大評論(我也同意),我原來的答覆不會RFC 4180 type CSV這裏我張貼工作更新解析在我下面的例子像那些複雜的CSV數據:

String str = 
    "m,n,o,\"p\nx\",q,r\n\"abc,123\",\"45,12\",\"a,aa\",\"b,bb\",\"c,cc\",\"fo\no,bar\""; 

String[] arr = str.split("\n\\s*(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 
String[][] csv = new String[arr.length][]; 
for(int r=0; r<arr.length; r++) 
    csv[r] = arr[r].split(",\\s*(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

測試:

for(int r=0; r<csv.length; r++) 
    System.out.println(Arrays.toString(csv[r])); 

OUTPUT:

[m, n, o, "p 
x", q, r] 
["abc,123", "45,12", "a,aa", "b,bb", "c,cc", "fo 
o,bar"] 
+0

+1,但如果問題的格式是RFC 4180類型的CSV,那麼只有合適的解析器才能解析它。例如,這是3列合適的CSV:''abc,123「',''2345 \ n12」',''a,aa「」b,bb「」c,cc「' – bezmax 2012-03-12 19:31:38

+0

完全同意@Max只有合適的解析器才能使用這些CSV數據。 – anubhava 2012-03-12 19:44:47

+0

@Max:我發佈了一個*更新*到我的答案,它應該與RFC 4180類型的CSV一起工作。 – anubhava 2012-03-12 20:04:09