Como faço para tratar corretamente CR ao ler arquivos de texto com OleDB
-
05-07-2019 - |
Pergunta
Eu tenho arquivos de texto que são Tab delimitado. Eu criei um Schema.ini assim:
[MY_FILE.TAB]
Format=TabDelimited
ColNameHeader=False
Col1=id Short
Col2=data Text
Este é o código que eu uso para lê-lo (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);
}
}
}
Tudo funciona bem, exceto por uma coisa. Os dados no arquivo de texto contém retornos de carro [CR]. -se registros são separados por retorno de carro Linha Feeds [CR] [LF]. Infelizmente, OleDB / MicrosoftJet (ou o que analisa esses arquivos) trata tanto ([CR], [CRLF]) o mesmo.
Exemplo de MY_FILE.TAB (deve haver um separador entre os números e textos):
1 One[CR][LF]
2 Two[CR][LF]
3 Th[CR]
ree[CR][LF]
4 Four[CR][LF]
Dá-me 5 linhas (malformados) na DataTable em vez de 4.
O que eu preciso é:
1 "One"
2 "Two"
3 "Th\nree"
4 "Four2
Mas eu recebo:
1 "One"
2 "Two"
3 "Th"
null null
4 "Four"
"ree" não pode ser convertido para Int32 então primeiro Colum na quarta linha é nulo.
Como posso configurar OleDB de tratar [CR] diferente [CR] [LF]? Ou quaisquer outras ideias?
Solução
Eu não acredito que você pode reconfigurar OLEDB para fazer isso diretamente.
Uma abordagem alternativa seria a utilização de um TextReader e TextWriter para processar o arquivo em um arquivo temporário, digitalização para e substituindo CR sozinho em algum sequência de escape especial. Em seguida, use OLEDB para ler este arquivo temporário de substituição; finalmente, substituir parte de trás seqüência de escape especial para um CR.
Outras dicas
Não seria fácil de ler o conteúdo do arquivo em uma string, dividi-lo por Environment.NewLine
ou \r\n
, que vai chegar uma matriz para cada linha, que pode ser ainda dividido por tab
?