Как мне правильно обрабатывать CR при чтении текстовых файлов с помощью OleDB
-
05-07-2019 - |
Вопрос
У меня есть текстовые файлы, разделенные табуляцией.Я создал 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
?