2012-10-23 4 views
3

J'ai un grand fichier (entrée) de texte (20 Mo) avec différentes lignes de texte (y compris des lignes vides). Je voudrais un fichier batch qui puisse trouver du texte spécifique dans le fichier d'entrée, saisir la chaîne dans laquelle se trouve le terme recherché, écrire cette chaîne dans un autre fichier texte (sortie) ET ajouter cette chaîne avec un espace, une virgule et la ligne qui la suit dans le fichier d'entrée dans le fichier de sortie.fichier batch pour rechercher du texte et l'écrire dans un fichier texte

  1. DONNEES D'ENTREE DU FICHIER:

    NORTHING   EASTING O-HEIGHT  CODE FFF STATION STD DEV MAPPROJ 
    

    020720618 NEO 000 4829559,470, 12082011c.lst

    0,015 0,015 0,015
    NEO 000 020740188 4835430,827, 12082011c.lst

    0.009 0.009 0.009
    NEO 000 020750232 4841535,651, 12082011c.lst

    0,004 0,004 0,004
    PLH 000 020720615 N 43 36 W 15,44568 38,22754 67,892 79 32 m 0, 12082011c.lst

    0,014 0,014 0,014, 12082011c.lst

  2. TERME dE RECHERCHE: "NEO"

  3. SORTIE:

    NEO 000 020720618 4.829.559,470 , 12082011c.lst, 0,015 0,015 0,015
    NEO 000 020740188 4.835.430,827, 12082011c.lst, 0,009 0,009 0,009
    NEO 000 020750232 4.841.535,651, 12082011c.lst, 0,004 0,004 0,004

J'ai essayé d'utiliser la findstr commande et il écrira la première partie de la ligne (NEO 000 020720618 4829559.470, 12082011c.lst) mais je n'arrive pas à comprendre comment saisir la ligne suivante et l'ajouter à la chaîne. (Les chaînes sont plus longues que ce que j'ai montré dans cet exemple, donc s'il y a une limite de caractères pour les variables s'il vous plaît faites le moi savoir). Merci, Gabe.

+0

Batch n'est pas un bon choix pour le traitement de texte. Cela pourrait être fait, mais il sera compliqué et probablement trop lent.Si vous souhaitez utiliser des outils de script Windows natifs, il est préférable d'utiliser PowerShell, VBScript ou JScript. Si vous êtes autorisé à utiliser des outils tiers alors un utilitaire comme sed pour Windows serait parfait. (Gnu a un port de sed libre pour Windows) – dbenham

+0

En outre, le traitement par lots ne peut traiter que des lignes d'une longueur maximale de 8191 octets. (en fait un peu moins, mais la valeur exacte dépend du code) – dbenham

+0

Merci beaucoup pour vos commentaires. J'ai eu l'impression de marcher dans un territoire compliqué. Je suis sensible à la route de traitement par lots car elle est facilement disponible mais je peux voir qu'elle a ses limites. – Gabe

Répondre

1

Comme je l'ai indiqué dans mon commentaire, le traitement par lots n'est pas un bon choix pour le traitement de fichiers texte. Mais voici une solution batch native pour votre problème. Je suppose que vous recherchez des lignes où le premier jeton est NEO, pas pour les lignes qui contiennent NEO n'importe où à l'intérieur. Il semble que vous vouliez ignorer les lignes vides, ce qui est bien parce que FOR/F ignore les lignes vides.

Cette solution ignore également toute ligne commençant par ; en raison de l'option FOR/F EOL par défaut. Cela peut être éliminé en définissant EOL à un caractère de saut de ligne, mais le syntax est moche. Je suppose que vous n'avez pas de lignes commençant par ;.

Comme pour toute solution de traitement par lots, les lignes sont limitées à ~ 8191 octets.

@echo off 
setlocal disableDelayedExpansion 
set "ln1=" 
>"output.txt" (
    for /f "useback delims=" %%A in ("input.txt") do (
    if defined ln1 (
     set "ln2=%%A" 
     setlocal enableDelayedExpansion 
     echo(!ln1! ,!ln2! 
     endlocal 
     set "ln1=" 
    ) 
    for /f %%B in ("%%A") do if "%%B"=="NEO" set "ln1=%%A" 
) 
) 
+0

Cela fonctionne parfaitement! Vos hypothèses sont correctes. Merci beaucoup. – Gabe

Questions connexes