Импорт файла CSV, который содержит более одного значения в поле - PullRequest
0 голосов
/ 10 августа 2011

Вот данные, которые я пытаюсь импортировать из CSV

Time|Person|Products|Address

(now)|person1|val1*val2*val3|adr1

, где * - перевод строки / возврат каретки

вот как это выглядит, когда я его импортирую:

(now)|person1|val1val2val3|adr1 

Вот как мне нужно, чтобы он выглядел:

(now)|person1|val1|adr1

(now)|person1|val2|adr1 etc.

Я пробовал: пользовательское кодирование синтаксического анализатора CSV, основанного в основном на string.Spilt(), оно дало мне точный результат и занимало целую вечность. Я попробовал CSVReader Себастьяна Лориона, и он дает мне точно такой же результат, хотя его было заметно быстрее и легче вставить в мой существующий код. Я даже попробовал VB TextFieldParser с точно таким же результатом.

Теперь вот что я подумал сделать:

Каким-то образом передают значения поля (я понятия не имею, как ссылаться на них), когда я достигаю его, к другому методу, который возвращает объект List<string>, через который я могу перебирать и добавлять в DataTable и оттуда делать то, что нужно , Удалите мой мозговой ствол старой вилкой. Ходить вокруг, бормоча себе под нос.

Вот код TextFieldParser:

OpenFileDialog op = new OpenFileDialog();
op.ShowDialog();
TextFieldParser parser = new TextFieldParser(new StreamReader(op.FileName));
parser.SetDelimiters(",");

while (!parser.EndOfData)
{
    contents.AddRange(parser.ReadFields());
}

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Мне кажется, что если вам нужно придерживаться этого формата CSV, я бы прочитал все это, как вы делаете выше; но после этого я бы просмотрел вашу коллекцию данных, а затем вручную разбил строки на нужные вам компоненты.

Попытка сделать все за один проход - слишком сложная проблема.

Как только у вас есть отдельные классы, вы можете разделить продукт на возврат каретки следующим образом:

string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
0 голосов
/ 10 августа 2011

Посмотрите библиотеку FileHelpers. Это очень быстро и довольно гибко. Хотя я думаю, вам придется написать немного собственной логики обработки для того, что вы хотите сделать.

...