2010-11-12 26 views
2

Je n'arrive pas à comprendre pourquoi, mais quand j'utilise un OleDbDataAdapter ou OleDbCommand pour lire un fichier CSV, dans les deux cas les données résultantes sont bien structurées (il reconnaît les colonnes de l'entête du fichier), mais les données de ligne sont toutes des chaînes vides.Lire des fichiers CSV avec OleDbCommand/OleDbDataAdapter

J'ai déjà fait du traitement CSV plusieurs fois avec succès, donc la seule différence que j'ai trouvée avec ce fichier est que tous les champs du fichier sont entourés de guillemets.
J'ai essayé d'utiliser un fichier schema.ini, mais en vain. Cela ressemble à un problème avec le composant Microsoft Jet 4.0, mais je ne peux pas comprendre quel est le problème.

Voici un extrait du fichier:

 
"UNIQUEID","OWNERID","PHONE1","PHONE2","EMERGENCYCONTACT","ADDRESS1","ADDRESS2","ADDRESS3","ADDRESSCITY","ADDRESSSTATE","ADDRESSZIP","UNIONCODE","CUSTOM1","CUSTOM2","CUSTOM3","CUSTOM4","CUSTOM5","CUSTOM6" 
"5","33","1235551212","   ","","1914 SANDFLAT ROAD","","","THOMASVILLE","AL","367849215","","contract","7.75","1","N","","A" 
"6","34","1235551212","   ","","1407 OLD HWY. 5 SOUTH","","","THOMASVILLE","AL","36784","","contract","7.75","1","N","","B" 
"7","35","1235551212","   ","","P.O. BOX 204","","","THOMASVILLE","AL","36784","","substitute","7.75","0","Y","","M" 
"8","36","1235551212","   ","","383 UNCLE BEN RD","","","THOMASVILLE","AL","36784","","substitute","0.00","0","","",""

Voici mon code actuel:

OleDbConnection conn = new OleDbConnection(
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\payroll;" + 
    "Extended Properties=\"text;HDR=Yes;FMT=CSVDelimited\""); 
OleDbDataAdapter adapter = new OleDbDataAdapter("select * from file.txt", conn); 
DataTable dt = new DataTable(); 
adapter.Fill(dt);

Voici le contenu du fichier schema.ini. Je ne pouvais pas lire le fichier sans:

[file.txt] 
Format=CSVDelimited 
ColNameHeader=True 
Col1="UNIQUEID" Text 
Col2="OWNERID" Text 
Col3="PHONE1" Text 
Col4="PHONE2" Text 
Col5="EMERGENCYCONTACT" Text 
Col6="ADDRESS1" Text 
Col7="ADDRESS2" Text 
Col8="ADDRESS3" Text 
Col9="ADDRESSCITY" Text 
Col10="ADDRESSSTATE" Text 
Col11="ADDRESSZIP" Text 
Col12="UNIONCODE" Text 
Col13="CUSTOM1" Text 
Col14="CUSTOM2" Text 
Col15="CUSTOM3" Text 
Col16="CUSTOM4" Text 
Col17="CUSTOM5" Text 
Col18="CUSTOM6" Text 
CharacterSet=ANSI
+0

Pouvez-vous montrer un échantillon de votre code actuel? – mellamokb

+0

Démarrez le fichier schema.ini avec une ligne vide. –

+0

Le démarrage de schema.ini avec une ligne vide n'a rien changé. – Lane

Répondre

2

J'ai découvert le problème. Le CharacterSet dans le fichier schema.ini a été défini sur ANSI. Le codage de fichier est Unicode. La définition du CharacterSet en Unicode a résolu le problème.

1

Ce qui est une autre alternative brillante est d'utiliser la bibliothèque FileHelpers @ www.filehelpers.com

Son beaucoup plus abstraite et flexible qu'un moteur à réaction, vous permettant de faire des choses comme sur l'importation du fichier à construire une collection directement de votre type à la volée avec des personnalisations.

i.e.

moteur FileHelperEngine = new FileHelperEngine(); Liste clients = engine.ReadFile ("File.csv");

Ceci est juste le début, et vous pouvez obtenir beaucoup plus propre en utilisant les opérateurs linq sur votre collection.

Sk8tz