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?

È stato utile?

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 ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top