2010-03-11 8 views
0

J'ai une application simple qui ouvre un fichier texte délimité par des tabulations et insère ces données dans une base de données.Cotations dans un fichier délimité par des tabulations

J'utilise ce lecteur CSV pour lire les données: http://www.codeproject.com/KB/database/CsvReader.aspx

Et il est tout fonctionne très bien!

Maintenant, mon client a ajouté un nouveau champ à la fin du fichier, qui est « ClaimDescription », et dans certaines de ces descriptions de réclamation, les données a des citations en elle, par exemple:

« SUMISEI MARU NO 2 "- mer du Japon

Cela semble causer un mal de tête majeur pour mon application. Je reçois une exception qui ressemble à ceci:

Le fichier CSV semble être endommagé près de l'enregistrement '1470' champ '26 à la position '181'. Données brutes actuelles: ...

Et dans ce "données brutes", bien sûr le champ de description de réclamation montre des données avec des guillemets.

Je veux savoir si quelqu'un a déjà eu ce problème auparavant, et l'ai-je contourné? Évidemment, je peux demander au client de modifier les données qu'il m'a initialement envoyées, mais il s'agit d'un processus automatisé qu'il utilise pour générer le fichier délimité par des tabulations; et je préfère l'utiliser en dernier recours. Je pensais que je pourrais peut-être ouvrir le fichier en utilisant un TextReader standard auparavant, échapper tous les devis, écrire le contenu dans un nouveau fichier, puis alimenter ce fichier dans le lecteur CSV. Il est probablement utile de mentionner que la taille moyenne de ces fichiers délimités par des tabulations est d'environ 40 Mo.

Toute aide est grandement appréciée!

Cheers, Sean

Répondre

0

À droite - après une nuit de redbull tardive et de me gratter la tête, j'ai finalement trouvé le problème, c'était des virgules dans le champ "Claim_Description". N'a même pas pensé à cela parce que j'utilisais un fichier délimité par des tabulations, mais dès que je l'ai fait trouver et remplacer sur toutes les virgules dans le fichier, cela a fonctionné absolument bien!

L'étape suivante consiste à découvrir comment remplacer ces virgules avant le traitement.

Encore une fois, merci pour toutes les suggestions.

Cheers, Sean

2

Utilisez plutôt la bibliothèque FileHelpers. Il est largement utilisé et fera face à des champs entre guillemets, ou des champs qui contiennent des citations.

+1

voir ceci -> http://www.secretgeek.net/csv_trouble.asp – IanL

+2

@Oded: La question ne demande pas comment faire face aux champs cités. Il s'agit de champs * non-cotés * contenant des guillemets. – LukeH

+0

@Luke: Hmmm. J'ai commencé à être en désaccord avec vous, sur la base qu'il n'y a pas de véritable «norme» CSV. J'ai trouvé un RFC pour ça, et on dirait que tu as raison d'après ça. –

2

Vérifiez le commentaire sur l'article CodeProject sur les citations:

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx

Vous devez spécifier dans le constructeur que vous voulez un autre personnage en plus "à utiliser comme des citations

+0

+1 Voici ce que vous devez faire. Si '" 'est utilisé comme un guillemet ailleurs dans le CSV, le fichier est juste incohérent et il n'y a pas de solution propre –

0

Peut-être pourriez-vous ouvrir le fichier avec votre application et remplacer chaque citation par un autre, puis la traiter

0

Je l'ai fait quelques recherches, et il y a un RFC pour les fichiers CSV (RFC 4180), et qui ne lui interdit explicitement ce qu'ils font:

Chaque champ peut ou non être mis entre guillemets (mais certains programmes, tels que Microsoft Excel, n'utilisent pas de guillemets ).Si les champs ne sont pas entourés de guillemets, alors les guillemets peuvent ne pas apparaître dans les champs.

Basiquement, si elles veulent le faire, ils ont besoin pour enfermer tout ce domaine entre guillemets, comme ceci:

,""SUMISEI MARU NO 2" - sea of Japan", 

Donc, si vous voulez, vous pouvez jeter ce problème de dos à eux et insister qu'ils vous envoyer un fichier "approprié" RFC 4180 CSV.

Puisque vous avez accès aux fichiers sources de ce lecteur CSV, une autre option serait de le modifier pour gérer le type de chaînes entre guillemets.

Ce genre de situation est exactement pourquoi il est essentiel d'avoir accès au code source de votre jeu d'outils. Si, à la place, vous souhaitez pré-traiter (pirater) leurs fichiers avant de les attribuer à votre outil, la méthode correcte serait de rechercher des champs avec une citation non immédiatement devant ou derrière un séparateur, et d'entourer sa totalité champ dans un autre ensemble de citations.

1

J'ai récemment résolu un problème similaire, et même si CSVReader fonctionnait correctement sur tous, mais quelques lignes de mon fichier TSV, ce qui a résolu mon problème à la fin a été la fixation d'un customDelimiter dans le constructeur de CsvReader

public static void ParseTSV(string filepath) 
    { 
     using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) { 
     //if that didn't work, passing unlikely characters into the other params might help 
     //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) { 
      int fieldcount = csvReader.FieldCount; 

      //Does not work, since it's read only property 
      //csvReader.Delimiter = "\t"; 

      string[] headers = csvReader.GetFieldHeaders(); 

      while (csvReader.ReadNextRecord()) { 
       for (int i = 0; i < fieldcount; i++) { 
        string msg = String.Format("{0}\r{1};", headers[i], 
               csvReader[i]); 
        Console.Write(msg); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 
Questions connexes