C# чтение текстового файла в datatable

мне нужно прочитать файлы, которые выглядят так, в datatable:

A02   BLANK031  
B02   F357442   
C02   F264977   
D02   BLANK037  
E02   F272521   
F02   E121562   
G02   F264972   
H02   F332321   
A03   E208240   
B03   F313854   
C03   E229786   
D03   E229787   
E03   F307584   
F03   F357478   

у меня странный разделитель и несколько пробелов в конце. как бы я прочитал это в таблице данных, чтобы первый столбец содержал «A02», «B02»... а второй столбец содержал «BLANK031», «F357442» и т. д..

в настоящее время я делаю:

DataTable dt = new DataTable();
                using (TextReader tr = File.OpenText(batchesAddresses[index]))
                {
                    string line;
                    while ((line = tr.ReadLine()) != null)
                    {

                    string[] items = Regex.Split(line, ' ');
                    if (dt.Columns.Count == 0)
                    {
                        // Create the data columns for the data table based on the number of items
                        // on the first line of the file
                        for (int i = 0; i < items.Length; i++)
                            dt.Columns.Add(new DataColumn("Column" + i, typeof(string)));
                    }
                        dt.Rows.Add(items);

                    }
                }

но это не работает, потому что у меня есть конечные пробелы и несколько пробелов между столбцами


person JOE SKEET    schedule 20.12.2010    source источник
comment
Для какой базы данных? Большинство из них имеют средства импорта данных из плоского файла без необходимости использования C#/Java/и т. д.   -  person OMG Ponies    schedule 20.12.2010
comment
@omg, это текстовые файлы, которые не приходят из базы данных   -  person JOE SKEET    schedule 20.12.2010
comment
Я сказал, что ты хочешь заново изобрести колесо   -  person OMG Ponies    schedule 20.12.2010


Ответы (3)


Если вы используете:

static readonly char[] space = { ' ' };
...
string[] items = line.Split(space, StringSplitOptions.RemoveEmptyEntries);

вы должны получить 2 ожидаемых значения, хотя может быть желательным что-то более избирательное, особенно если правая часть может содержать пробел посередине.

person Marc Gravell    schedule 20.12.2010
comment
спасибо, но я получаю эти ошибки: Ошибка 1 Лучший перегруженный метод, соответствующий 'string.Split (params char [])', имеет некоторые недопустимые аргументы, Ошибка 2. Аргумент '2': невозможно преобразовать из 'System.StringSplitOptions' в 'char ' - person JOE SKEET; 20.12.2010

Измените регулярное выражение на что-то вроде: (\w{3})\s+(\w{5,10}). Это означает захват 3 символов слов (включая цифры) в группу 1, поиск одного или нескольких символов пробела, а затем захват 5-10 символов слов в группу 2.

Затем выполните:

Regex r = new Regex("(\w{3})\s+(\w{5,10})");
Match m = r.Match(line);
string col1 = m.Groups[1].Value;
string col2 = m.Groups[2].Value;
person CodingGorilla    schedule 20.12.2010

Ошибка, связанная с System.StringSplitOptions, кажется ошибкой приведения в компиляторе. Добавьте перед оператором разделения строку, определяющую нужные параметры StringSplitOptions, а затем используйте переменную в операторе разделения.

static readonly char[] space = { ' ' };
static readonly StringSplitOptions options =  StringSplitOptions.RemoveEmptyEntries;
...
string[] items = line.Split(space, options);

Это должно работать для всех перегрузок.

person Neil Sederburg    schedule 20.04.2011