csv到字符串数组的数组

时间:2011-06-16 15:30:48

标签: java arrays arraylist

我正在创建一个实用程序类,使人们更容易解析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 个答案:

答案 0 :(得分:2)

execute()方法中,您不会重置temp变量,因此它会从所有行获取数据。只需在外部for循环中移动初始化。

答案 1 :(得分:1)

你在遍历线路的循环​​之外创建“temp”。因此,您不断向同一个临时对象添加字段。您希望在循环内移动此创建,因此您为每一行创建一个新对象。

另请注意,您未在字段中处理嵌入式逗号。也许这不会发生在您的数据中。但CSV标准是字段可以用引号括起来,在这种情况下应该删除引号。如果它用引号括起来,则可以包含逗号。如果字段包含引号,则应加倍。例如:

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

包含三个字段:

a
b,c
He said, "Hello"