Expression régulière avec findstr (ms-dos)
Je suis en train d'utiliser ms-dos commande findstr pour trouver une chaîne de caractères et l'éliminer du fichier.
Au moment où je peux trouver une chaîne explicite mais je suis vraiment du mal avec les expressions régulières.
Le fichier ressemble à quelque chose comme ci-dessous:
PLs - TULIP Report
Output_Format, PLS - TULIP REPORT
NUMLINES, 110907
VARIABLE_TYPES,T1,T8,I,T9,T2,N,N,N
[[data below]]
Le fichier est une exportation à partir d'un système et fâcheusement a cet en-tête dans il - donc, je tiens à le nettoyer avant de l'utiliser SQL Loader pour l'amener dans une base de données Oracle.
Il n'y a plus que juste un seul fichier et tous ont le même type d'en-tête, mais jamais de manière légèrement différente dans chaque fichier.
Même si je suis heureux de supprimer d'abord les 2 premières lignes à l'aide de valeurs codées en dur, par exemple:
findstr /v "PLs - TULIP Report" "c:\myfiles\file1.PRO" > "c:\myfiles\file1.csv"</code><br>
findstr /v "Output_Format, PLS - TULIP REPORT" "c:\myfiles\file1.csv" > "c:\myfiles\file2.csv"
(note comment je le faire en 2 étapes - des suggestions pour faire ceci se produire en une seule étape, serait massivelly apprécié)
La troisième ligne est mnore compliqué pour moi, elle sera toujours dans ce format:
NUMLINES, 110907
sauf que le numéro à la fin sera différente pour chaque fichier. Alors, comment puis-je obtenir à trouver l'intégralité de cette ligne à l'aide d'une expression régulière? J'ai essayé:
findstr /v /b /r "\D+ \s+ \d+"
mais sans succès.
Pour info, les données [[data below]]
ressemble
*,"00000161",456823,"017896532","FU",23.95,3.34,20.61
etc ..
Évidemment, je ne veux pas modifier la zone de données.
J'espère que le ci-dessus a un sens,
Grâce
- + ne fonctionnera pas utiliser l'astérisque. À moins que j'ai mal, cela fonctionne (findstr /B "NUMLINES, [0-9]" dos.txt) . Aussi, je ne pense pas que votre char classes \D, \s, \d sont pris en charge soit.
- Merci pour cela - je pense que je suis allé pour la mauvaise voie la plus compliquée! - juste testé sur l'un des fichiers et il fonctionne très bien. Sauriez-vous comment faire la dernière ligne de trop? c'est à dire
code
VARIABLE_TYPES,T1,T8,j',T9,T2,N,N,N/code
... et le saint graal, c'est de faire toutes ces lignes en une seule fois! 🙂 ... Sinon, j'ai aussi été à expérimenter avec le PLUS de commande, puisqu'il sera toujours les 4 premières lignes du fichier texte qui doivent être zappé, j'ai pensé que ce serait un bon candidat, mais il est très lent et il a également accroché pour une raison quelconque. - Oui, vous pouvez l'utiliser (findstr /B VARIABLE_TYPES, dos.txt). Notez que ceci suppose que vous n'aurez pas VARIABLE_TYPES dans vos données. Et si vous êtes sûr que les quatre premières lignes sont ignorées oui, vous pouvez utiliser (plus de +4 dos.txt).
- Êtes-vous vraiment à l'aide de ms-dos? Ou êtes-vous à l'aide de Windows (CMD.EXE) fichier batch?
Vous devez vous connecter pour publier un commentaire.
Vous devez exclure des lignes simples,
findstr
ne peut pas correspondre à plusieurs lignes. Juste séparer les différents regexes avec un espacePrécisant
/b
vous permet de trouver des correspondances seulement au début de la ligne et/v
exclut ces lignes.EDIT:
Bien sûr, l'utilisation est
Et dans
yourtarget
vous trouverez les données deyourfile
sauf les lignes exclus par la regex.EDIT 2:
En fonction de vos commentaires, vous devez simplement ajouter
VARIABLE_TYPES
à votre regex rendantC'est la façon de remplir l'ensemble de l'opération en une seule instruction.
code
findstr /r /b /v "PLs - Tulip Rapport Output_Format, PLS - TULIP RAPPORT NUMLINES, [0-9] VARIABLE_TYPES," source > targetfilecode
et ça a un charmeNUMLINES,
CET ESPACE[0-9]
. Ceux-ci seront considérés comme deux expressions régulières différentes!!!! Également utiliser le code dans la balise de commentaires cliquez sur aide et vous allez voir le mini format markdown 🙂 le code est entouré par deux ` (j'ai l'habitude d'ouvrir l'aide et copier&coller au personnage de mon commentaire)Ici est un liner à l'aide de regex qui va exclure tous les quatre lignes. (J'ai utilisé de continuation de ligne, de sorte que le code est mieux). Chaque ligne doit correspondre exactement. - Je prévoir pour chaque ligne à la fin en un nombre quelconque d'espaces parce que je n'étais pas sûr de votre format. Note - FINDSTR regex est très limité et non-standard. Il existe de nombreuses autres FINDSTR bizarreries et des bugs. Voir Quelles sont les sans-papiers, les caractéristiques et les limites de la Windows commande FINDSTR? pour plus d'info.
Si tout ce que vous devez faire est de sauter les 4 premières lignes, puis, normalement, vous devriez être en mesure d'utiliser PLUS. Mais il y a certaines circonstances, avec de gros fichiers PLUS bloquer, mais je ne me souviens pas des détails. Aussi PLUS permettra de convertir les tabulations en une série d'espaces.
Une autre option est d'utiliser un FOR /F en boucle. La FOR /F saute des lignes vides, mais je ne pense pas que c'est une préoccupation pour vous.
Si l'un de vos données peut commencer avec un
;
puis le code est un peu plus laide. Vous souhaitez désactiver la fin de vie de l'option en le définissant par un caractère de saut de ligne.