2012-03-12 12 views
0

私は、"\n"の行と、","(CSV形式の)フィールドに分けられたpurchaseDataと呼ばれるデータの文字列を持っています。アレイ内の各フィールドと配列を含むようにIは、2D文字列配列を作ることができる方法。String[i][j]ため、iライン値(行の位置)であろうとjが内のフィールドの位置であろうのでJava - データを2次元配列に分割する

選択されたデータ配列(行)

+4

あなたが何をしようとしたことがありますか?私がお勧めしたいのは、埋め込みループです(外側は次の行を取得するinnerはその行からフィールドを取得します)。私はあなたにコードを与えることができますが、私はあなたがこれまでに試したことを知りたいと思います。 – twain249

答えて

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

次のような2次元配列を作成するために、文字列#分割を使用することができます。

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では動作しないことが最大のコメント(と私は同意する)ので、私が投稿しています

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*(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

テスト:

以下の私の例のように、これらの複雑なCSVデータを解析するアップデート
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つの列、すなわち "abc、123"、 "2345 \ n12"、 "" aa "" b、bb "" c、cc "'の適切なCSVです。 – bezmax

+0

完全一致@Maxそのような種類のCSVデータでは適切なパーサーしか動作できません。 – anubhava

+0

@マックス:RFC 4180タイプのCSVで動作するはずの*アップデート*を私の回答に掲載しました。 – anubhava