in c #, en utilisant la classe regex code>, comment analysez-vous des valeurs séparées par des virgules, lorsque certaines valeurs peuvent être citées elles-mêmes contenant des virgules? 0 cat
1 dog
2 0 = OFF, 1 = ON
3 lion
4 tiger
5 R = red, G = green, B = blue
6 bear
9 Réponses :
Essayez avec cette regex:
Regex regexObj = new Regex(@"""[^""\r\n]*""|'[^'\r\n]*'|[^,\r\n]*");
Match matchResults = regexObj.Match(input);
while (matchResults.Success)
{
Console.WriteLine(matchResults.Value);
matchResults = matchResults.NextMatch();
}
Pour moi, votre dernière réponse modifiée donne la sortie suivante: 0 chat 1 2 chien 3 4 "0 = off, 1 = sur" 5 6 lion 7 8 Tiger 9 10 'r = rouge, g = vert, b = bleu "11 12 ours 13
@CMS: J'ai pu avoir votre idée de travailler pour moi, mais je devais faire une petite modification (remplaçant * par + à la fin). Mon regex est ... nouvelle regex (@ "" "" "\ r \ n] *" "| '' '' '[^' \ r \ n] * '| [^, \ r \ n] +")
Presque oublié: merci, CMS et d'autres pour votre précieuse contribution.
Whoops ... a parlé trop tôt ... ma "solution" ne fonctionne pas quand certains champs sont "vides" ... Voir, par exemple, les deux virgules consécutives suivant Cat: "Cat , Dog, \" 0 = Off , 1 = sur \ ", lion, tigre, 'r = rouge, g = vert, b = bleu', ours"
Le CSV n'est pas régulier - les regexes jamais i> puissent analyser tous les fichiers CVS valides. comme toujours. C'est une folie sauf comme un hack sale ...
Voici ce que j'ai enfin installé sur ... String Regexstring = "" + "((? <= \") [^ \ "] * (? = \")) "//" ... "+" | ((? <= \ ') [^ \'] * (? = \ ')) "//" ... ... "+" | (^ [^,] * (? = ,))) "/// ^ ... ..., +" | ((? <=,) [^,] * $) "//, ..." $ + "| (? < =,). {0} (? =,) "// , +" | (? <=,) ([^ \ "\ ']. *?)" //, ... (à l'exclusion «') à ...,; regex regex = nouvelle regex (regexstring);
@Jaysonfix diriez-vous de poster cette solution dans votre question? J'ai exactement le même problème et votre solution est un peu difficile à lire dans un commentaire comme ça.
Ce n'est pas une regex, mais j'ai utilisé Microsoft.visalbasic.fileio.texalbasicparser pour accomplir cela pour les fichiers CSV. Oui, cela pourrait se sentir un peu étrange ajouter une référence à Microsoft.visualbasic dans une application C #, peut-être même un peu sale, mais bon cela fonctionne. P>
+1 Excellente solution dans mon cas. Il est installé avec le cadre afin qu'aucun des assemblages supplémentaires n'ajoutez à l'installateur et sans groupe de fichiers source supplémentaire pour une tâche simple.
Pourquoi ne pas tenir compte des conseils des experts et Ne roule pas votre propre analyseur CSV . p>
Votre première pensée est: "Je dois manipuler des virgules à l'intérieur des citations." P>
Votre prochaine pensée sera: «Oh, merde, j'ai besoin de gérer des citations à l'intérieur des citations. Quotes échappés. Doubles citations. Citations simples ..." P>
C'est une route de la folie. N'écrivez pas le vôtre. Trouvez une bibliothèque avec une couverture de test d'unité étendue qui frappe toutes les parties durs et a traversé l'enfer pour vous. Pour .NET, utilisez la source gratuite et open source bibliothèque FichierHelPers . P>
C'était ma première pensée aussi.
Une autre raison: la spécification CSV est en fait étonnamment complexe, compte tenu de toutes les différentes manières de citer et de délimiter les valeurs. Sans parler du fait qu'il n'est pas i> en fait une spécification pour le CSV ... (il y a RFC4180, mais cela indique explicitement que ce n'est qu'une "tentative" à une spécification commune et que les implémentations réelles varient. ) Les chances sont donc, si vous vous lancez le vôtre, vous le ferez mal.
J'ai trouvé que Csvhelper fonctionne bien et c'est dans Nuget ( Joshclose.github.io/csvhelper ). Il est sous licence MS-Pl, qui est moins effrayante que la bibliothèque de fichiers sous licence LGPL si vous avez un produit commercial.
Après avoir découvert que ce n'était pas une annonce, mais une bibliothèque sérieuse, j'ai constaté que prenant les extraits dont j'avais besoin et que j'utilisais, je me plaisait la meilleure solution: la plus petite bibliothèque de ce dont j'avais besoin et de Code fiable lors de l'utilisation de fichiersHelPers.
ah, regex. Maintenant, vous avez deux problèmes. ;)
J'utiliserais un tokenizer / analyseur, car il est assez simple, et plus important encore, beaucoup plus facile de lire pour la maintenance ultérieure. P>
Ceci fonctionne, par exemple: P> < Pré> xxx pré> p>
Il y a un bogue dans cette mise en œuvre. Dans ienumerator
Merci @dpan, corrigé
Fonction: utilisation p> sortie: p>
CSV n'est pas régulier . À moins que votre langue regex ait suffisamment de puissance pour gérer la nature stalière de l'analyse de la CSV (improbable, la MS One ne le fait pas), toute solution pure regex est une liste de bogues en attente de se produire lorsque vous avez touché une nouvelle source d'entrée qui n'est pas Assez em> géré par la dernière regex. p>
La lecture du CSV n'est pas si complexe d'écrire en tant que machine d'état puisque la grammaire est simple, mais vous devez même que vous devez envisager: citations citations, virgules dans des citations, de nouvelles lignes dans des guillemets, des champs vides. P>
En tant que tel, vous devriez probablement utiliser l'analyseur CSV de quelqu'un d'autre. Je recommande CSVREADER pour .NET P>
Il suffit d'ajouter la solution que j'ai travaillé ce matin.
2,3.03,"Hello, my name is ""Joshua""",A,B,C,,,D
@Joshua, c'est la meilleure regèt de fractionner une chaîne que j'ai trouvée. Et j'ai essayé assez quelques-uns. La magie semble être au (? <= ^ |,) Code> partie. La plupart des solutions similaires ont : ^ code> plutôt que <= ^ code>. Les autres solutions seront incorrectes pour ", 1", le réduire à une correspondance de 2, l'identifie correctement. 3. Merci.
C'est une solution fantastique.
J'ai trouvé quelques bugs dans cette version, par exemple une chaîne non citée qui dispose d'une seule citation de la valeur.
Et je suis d'accord Utilisez la bibliothèque FileHelper lorsque vous pouvez, mais cette bibliothèque nécessite que vous sachiez quoi Vos données ressembleront à ... J'ai besoin d'un analyseur générique. p>
J'ai donc mis à jour le code ci-après et je pensais que je partageais ... p>
Trouvé des bugs dans quelle version i>? Les réponses n'apparaissent pas dans une commande correcte, donc si vous souhaitez faire référence à une autre réponse, il est préférable de le lier directement. Le bouton partager code> ci-dessous La réponse fournit l'URL appropriée.
Depuis cette question: regex à analyser CSV avec des citations imbriquées < / a> rapporte ici et est beaucoup plus générique, et étant donné qu'une regex n'est pas vraiment la bonne façon de résoudre ce problème (c'est-à-dire que j'ai eu de nombreux problèmes avec une arrière-marche catastrophique ( http://www.regular-expressions.info/catrophique.html ) p> Voici une simple mise en œuvre d'analyseurs en python aussi bien p>
Plutôt que de commencer par la solution - des expressions régulières - et d'essayer d'y appliquer le problème, envisagez d'aller dans l'autre sens. Commencez avec le problème et choisissez l'outil qui le résout clairement bien. Personnellement, je résoudrais ce problème en écrivant un Lexer pour votre langue. Ce code est susceptible d'être plus clair, compréhensible, débisible et extensible que le bruit de la ligne de modem qui est une expression régulière.