2010-07-05 11 views
2

Ceci est une extension à une question connexe répond Hereexpression régulière pour rechercher et remplacer unescaped guillemets non successifs dans le fichier CSV

Je dispose d'un fichier csv hebdomadaire qui doit être analysée. ça ressemble à ça.

"asdf","asdf","asdf","asdf"

Mais parfois, il y a des champs de texte qui contiennent une chaîne double citation non échappée supplémentaire comme celui-ci

"asdf","as "something" df","asdf","asdf"

Des autres postes sur ce site, j'ai pu mettre sur pied un regex

(?m)""(?![ \t]*(,|$)) 

qui correspond à deux doubles guillemets successifs, seulement "si mma ou fin de ligne devant eux avec éventuellement des espaces et des tabulations entre "

maintenant ne trouve que des guillemets successifs. Comment puis-je le modifier pour trouver et remplacer/supprimer les guillemets autour de "quelque chose" dans le fichier?

merci.

+2

Quelle que soit la langue que vous utilisez, vous avez certainement déjà un analyseur CSV. Avez-vous vérifié si cela est déjà capable de gérer des entrées mal formées? (et vous évite ainsi de réinventer la roue) –

+0

Je n'utilise aucun langage de programmation, cela fait partie d'un processus qui automatise fondamentalement un tas de fichiers pour le traitement par lot quotidien. et le client utilise un programme d'automatisation appelé winautomation qui a essentiellement une action Replace Text intégrée qui accepte l'expression regex de la saveur .NET dans les paramètres find/replace. – stevenjmyu

+0

Ok, bien tout cela aurait dû faire partie de la question - en particulier la partie ".NET regex saveur". –

Répondre

6
(?<!^|,)"(?!,|$) 

correspond à un guillemet double qui n'est pas précédé ou suivi d'une virgule ni situé au début ou à la fin de la ligne. Si vous devez autoriser les espaces autour des virgules ou au début/à la fin de la ligne, et si votre style regex (que vous n'avez pas spécifié) autorise une recherche de longueur arbitraire (par exemple, .NET, par exemple), vous pouvez utiliser

(?<!^\s*|,\s*)"(?!\s*,|\s*$) 
+0

wow, merci beaucoup, Tim. C'est la saveur .NET. J'utilise actuellement une fonction de recherche/remplacement de texte dans un programme d'automatisation appelé winautomation. Cependant, en utilisant votre regex dans une recherche et un remplacement, vous remplacez le premier double guillemet et le dernier double guillemet de chaque ligne. il semble trouver et remplacer les doubles guillemets non échappés dans chaque champ de texte.Donc, en utilisant un "asdf", "as" quelque chose "df", "asdf" comme exemple, trouver et remplacer par ^, je reçois^asdf "," comme^quelque chose^df "," asdf^ comment est-ce que je remédie à la première et à la dernière? " – stevenjmyu

+0

Vous devez définir l'option permettant à'^'et' $ 'de faire correspondre le début et la fin des lignes (au lieu de l'entrée entière.) Dans .NET, cette option s'appelle' RegexOptions .Multiline.Je ne sais pas si vous pouvez passer cette option à winautomation. –

2

j'utilisais VIM pour supprimer les citations imbriquées dans un fichier .csv et cela a fonctionné pour moi:

"[^,"][^"]*"[^,] 
0

dans vim je cela pour enlever toutes les citations unescaped.

:%s/\v("(,")@!)&((",)@<!")&("(\n)@!)&(^@<!")//gc 

explication détaillée est,

: - start the vim command 
    % - scope of the command is the whole file 
    s - search and replace 
     /- start of search pattern 
     \v - simple regex syntax (rather than vim style) 
      (
       " - double quote 
       (,") - comma_quote 
       @! - not followed by 
      ) 
      & - and 
      (
       (",) - quote_comma 
       @<!- does not precedes 
       " - double quote 
      ) 
      & - and 
      (
       " - double quote 
       (\n) - line end 
       @! - not followed by 
      ) 
      & - and 
      (
       ^- line beginning 
       @<! - does not precedes 
       " - double quote 
      ) 
     /- end of search pattern and start of replace pattern 
      - replace with nothing (delete) 
     /- end of replace pattern 
    g - apply to all the matches 
    c - confirm with user for every replacement 

ce fait le travail assez rapidement. La seule instance qui échoue est quand il y a des instances de "," pattern dans les données.