Come gestisco correttamente CR durante la lettura di file di testo con OleDB
-
05-07-2019 - |
Domanda
Ho file di testo delimitati da tabulazioni. Ho creato uno Schema.ini in questo modo:
[MY_FILE.TAB]
Format=TabDelimited
ColNameHeader=False
Col1=id Short
Col2=data Text
Questo è il codice che uso per leggerlo (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);
}
}
}
Tutto funziona bene, tranne una cosa. I dati nel file di testo contengono i ritorni a capo [CR]. I record stessi sono separati dagli avanzamenti riga ritorno carrello [CR] [LF]. Sfortunatamente, OleDB / MicrosoftJet (o qualunque cosa analizzi questi file) tratta entrambi ([CR], [CRLF]) allo stesso modo.
Esempio di MY_FILE.TAB (dovrebbe essere presente una scheda tra numeri e testo):
1 One[CR][LF]
2 Two[CR][LF]
3 Th[CR]
ree[CR][LF]
4 Four[CR][LF]
Fornisce 5 righe (non valide) nella DataTable anziché 4.
Quello di cui ho bisogno è:
1 "One"
2 "Two"
3 "Th\nree"
4 "Four2
Ma ottengo:
1 "One"
2 "Two"
3 "Th"
null null
4 "Four"
" ree " non può essere convertito in Int32, quindi la prima colonna nella quarta riga è nulla.
Come posso configurare OleDB per trattare [CR] diverso da [CR] [LF]? O altre idee?
Soluzione
Non credo che tu possa riconfigurare OLEDB per farlo direttamente.
Un approccio alternativo sarebbe quello di utilizzare un TextReader e un TextWriter per elaborare il file in un file temporaneo, scansionando e sostituendo CR da solo in una sequenza di escape speciale. Quindi utilizzare OLEDB per leggere questo file temporaneo di sostituzione; infine, sostituisci la sequenza di escape speciale con una CR.
Altri suggerimenti
Non sarebbe facile leggere il contenuto del file in una stringa, dividerlo per Environment.NewLine
o \ r \ n
, che ti darà un array per ogni riga, che puoi ulteriormente dividere per tab
?