Как правильно обрабатывать CR при чтении текстовых файлов с OleDB - PullRequest
0 голосов
/ 27 ноября 2009

У меня есть текстовые файлы с разделителями табуляции. Я создал Schema.ini так:

[MY_FILE.TAB]
Format=TabDelimited
ColNameHeader=False
Col1=id Short
Col2=data Text

Это код, который я использую для чтения (C #):

using (var connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\FolderToData\;Extended Properties='text;FMT=delimited'"))
{
  using (var command = new OleDbCommand("SELECT * FROM MY_FILE.TAB", connection))
  {
    var table = new DataTable();
    using (var adapter = new OleDbDataAdapter(command)
    {
      adapter.Fill(table);
    }
  }
}

Все отлично работает, кроме одной вещи. Данные в текстовом файле содержат возврат каретки [CR]. Записи сами по себе разделены фидами возврата каретки [CR] [LF]. К сожалению, OleDB / MicrosoftJet (или все, что разбирает эти файлы) обрабатывает оба ([CR], [CRLF]) одинаково.

Пример MY_FILE.TAB (должна быть вкладка между цифрами и текстом):

1   One[CR][LF]
2   Two[CR][LF]
3   Th[CR]
ree[CR][LF]
4   Four[CR][LF]

Дает мне 5 (неправильно сформированных) строк в таблице данных вместо 4.

Что мне нужно, это:

1   "One"
2   "Two"
3   "Th\nree"
4   "Four2

Но я получаю:

1    "One"
2    "Two"
3    "Th"
null null
4    "Four"

"ree" нельзя преобразовать в Int32, поэтому первый столбец в четвертом ряду равен нулю.

Как настроить OleDB для обработки [CR] отличным от [CR] [LF]? Или любые другие идеи?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

Я не верю, что вы можете перенастроить OLEDB, чтобы сделать это напрямую.

Альтернативным подходом было бы использование TextReader и TextWriter для обработки файла во временный файл, сканирования и замены одного CR в какой-либо специальной escape-последовательности. Затем используйте OLEDB для чтения этого временного файла замены; наконец, замените специальную escape-последовательность обратно на CR.

0 голосов
/ 27 ноября 2009

Не будет ли легко прочитать содержимое файла в строке, разделив его на Environment.NewLine или \r\n, что даст вам массив для каждой строки, который вы можете затем разделить на tab?

...