Pregunta

Tengo archivos de texto que están delimitados por tabulaciones. Creé un Schema.ini así:

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

Este es el código que utilizo para leerlo (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);
    }
  }
}

Todo funciona bien, excepto por una cosa. Los datos en el archivo de texto contienen Retornos de carro [CR]. Los registros en sí están separados por las líneas de retorno de carro [CR] [LF]. Desafortunadamente, OleDB / MicrosoftJet (o lo que sea que analice estos archivos) trata a ambos ([CR], [CRLF]) de la misma manera.

Ejemplo de MY_FILE.TAB (debe haber una pestaña entre los números y el texto):

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

Me da 5 (malformadas) filas en el DataTable en lugar de 4.

Lo que necesito es:

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

Pero me sale:

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

" ree " no se puede convertir a Int32, por lo que la primera columna en la cuarta fila es nula.

¿Cómo puedo configurar OleDB para tratar [CR] diferente a [CR] [LF]? ¿O alguna otra idea?

¿Fue útil?

Solución

No creo que puedas reconfigurar OLEDB para hacer esto directamente.

Un enfoque alternativo sería usar un TextReader y TextWriter para procesar el archivo en un archivo temporal, buscar y reemplazar CR solo en una secuencia de escape especial. Luego use OLEDB para leer este archivo temporal de reemplazo; finalmente, vuelva a colocar la secuencia de escape especial en un CR.

Otros consejos

¿No sería fácil leer el contenido del archivo en una cadena, dividirlo por Environment.NewLine o \ r \ n , que le proporcionará una matriz para cada línea, que puede dividir por la pestaña ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top