Question

J'ai des fichiers texte délimités par des tabulations. J'ai créé un fichier Schema.ini comme suit:

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

C’est le code que j’utilise pour le lire (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);
    }
  }
}

Tout fonctionne bien, sauf pour une chose. Les données du fichier texte contiennent Carriage Returns [CR]. Les enregistrements sont séparés par des retours à la ligne [CR] [LF]. Malheureusement, OleDB / MicrosoftJet (ou tout ce qui analyse ces fichiers) traite les deux ([CR], [CRLF]) de la même manière.

Exemple de MY_FILE.TAB (il devrait y avoir une tabulation entre les nombres et le texte):

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

me donne 5 lignes (mal formées) dans le DataTable au lieu de 4.

Ce dont j'ai besoin, c'est:

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

Mais je reçois:

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

" ree " ne peut pas être converti en Int32, la première colonne de la quatrième ligne est donc nulle.

Comment configurer OleDB pour traiter [CR] différemment de [CR] [LF]? Ou d'autres idées?

Était-ce utile?

La solution

Je ne pense pas que vous puissiez reconfigurer OLEDB pour le faire directement.

Une autre approche consisterait à utiliser TextReader et TextWriter pour traiter le fichier dans un fichier temporaire, en recherchant et en remplaçant le CR seul dans une séquence d'échappement spéciale. Ensuite, utilisez OLEDB pour lire ce fichier temporaire de remplacement; enfin, remplacez la séquence d'échappement spéciale par un CR.

Autres conseils

Ne serait-il pas facile de lire le contenu du fichier dans une chaîne, divisez-le en Environment.NewLine ou \ r \ n , ce qui vous donnera un tableau pour chaque ligne, que vous pouvez diviser par onglet ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top