¿Cómo manejo correctamente el CR al leer archivos de texto con OleDB?
-
05-07-2019 - |
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?
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
?