csv в массив массивов строк - PullRequest
0 голосов
/ 16 июня 2011

Я создаю служебный класс, который облегчит людям синтаксический анализ строки 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 ]

2 голосов
/ 16 июня 2011

В вашем методе execute() вы не сбрасываете переменную temp, поэтому она получает данные из всех строк.Просто переместите свою инициализацию во внешний for -loop.

1 голос
/ 16 июня 2011

Вы создаете «temp» вне цикла, проходящего через линии.Таким образом, вы постоянно добавляете поля к одному и тому же временному объекту.Вы хотите переместить создание этого внутри цикла, поэтому вы создаете новый объект для каждой строки.

Также обратите внимание, что вы не обрабатываете запятые в поле.Может быть, это не происходит в ваших данных.Но стандарт CSV заключается в том, что поле может быть заключено в кавычки, и в этом случае кавычки должны быть удалены.Если он заключен в кавычки, он может содержать запятые.Если поле содержит кавычки, они должны быть удвоены.Например:

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

содержит три поля:

a
b,c
He said, "Hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...