Comment gérer correctement les CR lorsque je lis des fichiers texte avec OleDB
-
05-07-2019 - |
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?
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
?