Question

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

J'utilise ce lecteur CSV pour lire les données: http: // www .codeproject.com / KB / base de données / 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 2" - mer du Japon

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

  

Le CSV semble être corrompu près de l'enregistrement « 1470 » champ '26 à la position « 181 ». données brutes actuelle: ...

Et que les « données brutes », assez sûr le champ de description des demandes montre des données avec des citations en elle.

Je veux savoir si quelqu'un a déjà eu ce problème avant, et a obtenu le tour? Il est évident que je peux demander au client de modifier les données qu'ils envoient à l'origine pour moi, mais c'est un processus automatisé qu'ils utilisent pour générer le fichier délimité par des tabulations; et je préfère utiliser comme un dernier recours.

Je pensais que je pourrais peut-être ouvrir le fichier en utilisant un TextReader standard avant la main, échapper à toutes les citations, écrire le contenu de nouveau dans un nouveau fichier, puis alimenter ce fichier dans le CSV Reader. Il est sans doute utile de mentionner que la taille moyenne des fichiers de ces fichiers délimités par des tabulations est d'environ 40Mo.

Toute aide est grandement appréciée!

Cheers, Sean

Était-ce utile?

La solution 7

Droit - après une fin de nuit de Redbull et me gratter la tête, j'ai finalement trouvé le problème, il était des virgules dans le champ « Claim_Description ». Je ne pensais même pas à ce sujet parce que j'utilisais un fichier délimité par des tabulations, mais dès que je l'ai fait une recherche et sur toutes les virgules remplacer dans le fichier, il a travaillé tout à fait bien!

L'étape suivante consiste à savoir comment remplacer les virgules avant de traiter.

Encore une fois, merci pour toutes les suggestions.

Cheers, Sean

Autres conseils

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

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

Vous devez spécifier dans le constructeur que vous voulez un autre personnage en plus "à être utilisé comme guillemets.

Utilisez les FileHelpers bibliothèque à la place. Il est largement utilisé et faire face aux champs cités, ou les champs qui contiennent des guillemets.

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();
            }
        }
    }

Peut-être que vous pouvez ouvrir le fichier avec votre application et remplacer chaque citation avec un autre personnage et traiter ensuite.

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 ne peut pas être mis entre guillemets doubles (mais   certains programmes, tels que Microsoft Excel, ne pas utiliser des guillemets doubles   du tout). Si les champs ne sont pas entourés par des guillemets, puis   guillemets doubles 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 vous insistez, ils envoient un « bon » fichier CSV RFC 4180.

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

Ce genre de situation est exactement la raison pour laquelle il est essentiel d'avoir accès au code source de votre jeu d'outils.

Si au contraire vous souhaitez prétraiter (pirater) leurs fichiers avant de les à votre outil voyant, la bonne méthode serait de rechercher des champs avec une citation pas immédiatement devant ou derrière un séparateur, et enfermer son champ entier dans une autre série de citations.

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