Как мне правильно обрабатывать CR при чтении текстовых файлов с помощью OleDB

StackOverflow https://stackoverflow.com/questions/1809272

Вопрос

У меня есть текстовые файлы, разделенные табуляцией.Я создал 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 (искаженных) строк в DataTable вместо 4.

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

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

Но я получаю:

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top