2011-06-16 82 views
0

我創建一個實用工具類,這將使人們更容易解析一個CSV字符串並返回一個字符串數組的數組的數組的數組。CSV爲字符串

我的代碼幾乎工作,但由於某些原因,當我在第一排做我的結果弄,我期待看到1行,看到級聯的第一行上幾行。

簡單的例子:

a,b,c,d 
e,f,g,h 

期待:{a,b,c,d}, {e,f,g,h}

結果:{a,b,c,d,e,f,g}

public class csvParse 
{ 
protected String      originalCSV; 
protected int       skipToLine; 
protected ArrayList<ArrayList<String>> parsedList; 

public ArrayList<ArrayList<String>> getParsedList() 
{ 
    return parsedList; 
} 

public void setParsedList(ArrayList<ArrayList<String>> parsedList) 
{ 
    this.parsedList = parsedList; 
} 

public csvParse(String incomingCSV, int skipToLine) 
{ 
    super(); 
    this.originalCSV = incomingCSV; 
    this.skipToLine = skipToLine; 
    this.parsedList = new ArrayList<ArrayList<String>>(); 
    execute(); 
} 

protected void execute() 
{ 
    // breaking this so there's an error. read below 
    //TODO: Make sure you have data out to X. May use a try/catch? 
    String row; 
    String lines[] = this.originalCSV.split("\\n?\\r"); 

    ArrayList<String> temp = new ArrayList<String>(); 
    try{ 
     for (int i = this.skipToLine; i < lines.length; i++) 
     { 
      row = lines[i]; 

      //split on commas 
      String[] RowData = row.split(","); 

      for (int x = 0; x < RowData.length; x++) 
      { 
       temp.add(RowData[x]); 
      } 
      this.parsedList.add(temp); 
     } 
    } 
    finally{ 

    } 
} 
} 
+2

又有什麼問題? – pickypg 2011-06-16 15:31:50

+0

incomingCSV如何生成? – Atreys 2011-06-16 15:33:49

+0

嘗試魔'按Ctrl-Shift鍵F' – 2011-06-16 16:49:02

回答

2

在你​​方法,你不要重置temp變量,所以它從獲取數據所有行。只需在外部for -loop內移動您的初始化即可。

+0

呃。我怎麼沒看出來。謝謝。 – kireol 2011-06-16 15:44:19

1

創建「TEMP」,通過該行變爲外循環。因此,您不斷地將字段添加到同一個臨時對象。你想在循環中移動這個創建,所以你爲每一行創建一個新的對象。

另外請注意,你是不是處理一個領域內嵌入的逗號。也許這不會在你的數據中發生。但CSV標準是一個字段可能用引號引起來,在這種情況下,引號應該被刪除。如果它包含在引號中,則可以包含逗號。如果一個字段包含引號,它們應該加倍。例如:

a,"b,c","He said, ""Hello""" 

包含三個字段:

a 
b,c 
He said, "Hello" 
+0

我有處理引號中的逗號的代碼,我只是沒有包括它按照SO的要求來保持簡單。感謝雖然:) – kireol 2011-06-16 15:46:16