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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top