0
votes

Échange de ligne de fichier de lots par numéro de ligne

J'ai écrit un programme de lots qui échange une ligne d'un fichier .txt code>. J'ai deux .txt code> fichiers:

Le premier, test1.txt code> contient l'enregistrement qui ressemble à ceci: p> xxx pré >

Le deuxième fichier .txt ( test2.txt code>) contient une ligne avec numéro de ligne et ressemble à ceci: p>

setlocal EnableDelayedExpansion

for /F "tokens=1 delims=:" %%a in (test2.txt) do (
    set lng=%%a
)   

for /F "tokens=1 delims=" %%a in (test2.txt) do (
        set lnh=%%a
)   

set lineNumberExchange=%lng%
set lineNew=%lnh%

if exist beispiel.tmp del beispiel.tmp

set lineNr=0

for /f "delims=" %%A in (test1.txt) do (
    set /a lineNr+=1 >NUL
    if !lineNr!==%lineNumberExchange% ( 
        echo %lineNew%>>beispiel.tmp
    ) 
    else ( 
        echo %%A>>beispiel.tmp
    )
)


3 commentaires

Pourquoi créez-vous une variable de numéro de ligne? Vous avez déjà le numéro de ligne dans chaque fichier. Pourquoi ne pas regarder le numéro de ligne qui est dans test1.txt?


5 Réponses :


1
votes

Je suggérerais le code suivant pour cette tâche: xxx

Tout d'abord, faisant une boucle pour trouver le mot remplacé, puis remplacer par une autre boucle.

Un autre WAY, vous pouvez souhaiter, c'est trouver la troisième ligne des deux fichiers ou simplement en supposant que test2.txt n'a qu'une seule ligne mentionnée dans votre question.

supposant ce qui précède, le Code suivant fonctionne: xxx

si votre fichier test1.txt ne contient pas n: remplacer (echo% line_number%:% Remplacer%%) >> "test1.txt" avec (echo% remplacer%) >> "test1.txt" dans Tous les cas .

Si la même chose se produit avec le fichier test2.txt , remplacez pour / f "jetons = 2 Delims =:" %% A in (test2. txt) faire ( avec pour / f "delims =" %% A in (test2.txt) do ( dans tous les cas . << p> et en supposant que la valeur stockée dans remplacer la variable est dans la troisième ligne, utilisez: xxx


3 commentaires

Je pense que le point est de générer de manière dynamique le numéro de ligne qui doit être remplacé. Vous avez du mal à coder le 3 .


Le numéro de ligne à remplacer est littéralement dans le test2.txt. Vous ne devriez pas être corrigé le numéro de ligne qui doit être remplacé. Le numéro de ligne correspondant est également dans les données pour Test1.txt.


@Squashman j'ai fait une autre modification pour le code dur. C'est bon maintenant?



0
votes

IIUR Le fichier test2.txt contient le numéro de ligne à remplacer et le texte de remplacement séparé par un côlon.

Je lirais les remplaçants dans un tableau et vérifiez si l'on existe une fois itération Le fichier text1.txt

De cette façon, vous pouvez avoir plusieurs remplacements (et un texte plus long)

donné ces fichiers d'échantillon: < Pré> xxx

Ce lot: xxx

donne cette sortie: xxx


1 commentaires

Bonjour, j'ai essayé votre solution. Dans l'écho, la sortie est affichée correctement, mais rien n'est écrit dans le test1.txt?



0
votes

avec test1.txt et test2.txt comme dans votre question, vous pouvez avoir ceci comme test.cmd : xxx < / Pré>

Cela devrait émettre ce que vous voulez Test3.txt .


0 commentaires

1
votes

C'est comme ça que je le ferais: xxx


0 commentaires

0
votes

Voici une version plus générique qui permet au fichier de remplacement ( test2.txt code>) pour contenir plus d'une ligne, en fonction des hypothèses suivantes:

  • Les longueurs de lignes des deux fichiers d'entrée ne dépassent pas 1021 caractères / octets, y compris le préfixe de numéro de ligne; LI>
  • fichier à modifier ( test1.txt code>) contient moins de 2 31 sup> lignes; li>
  • Les numéros de ligne de fichier à modifier doivent être continus et commencer par un; li>
  • Les numéros de ligne de fichier de remplacement doivent être triés par ordre croissant, aucun doublé ne se produit; Li> ul>

    Ceci est le code du script, appelons-le remplacer-numéroté-lignes.bat code>: p> xxx pré>

    ceci Lit uniquement les lignes de chaque fichier d'entrée, la performance devrait donc être assez bien. p>

    Pour l'appliquer sur vos fichiers d'entrée, appelez-le à la ligne de commande suivante: p>

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Define constants here:
    set "_FILE=%~f1" & rem // (file whose lines are to be replaced)
    set "_REPL=%~f2" & rem // (file that contains replacement lines)
    set "_RETF=%~f3" & rem // (return file)
    
    rem /* Build temporary file path (the temporary file allows the return file to be
    rem    the same as an input file): */
    :LOOP_TEMP
    for %%F in ("%TEMP%\%~n0_%RANDOM%.tmp") do set "TMPF=%%~fF"
    if /I "%TMPF%"=="%_FILE%" goto :LOOP_TEMP
    if /I "%TMPF%"=="%_RETF%" goto :LOOP_TEMP
    
    rem // Determine number of lines of file to modify:
    for /F %%C in ('^< "%_FILE%" find /C /V ""') do set "FCNT=%%C"
    
    rem // Open both files for being read:
    < "%_FILE%" > "%TMPF%" (
        setlocal EnableDelayedExpansion
        rem // Loop through the lines of the file to modify:
        for /L %%I in (1,1,%FCNT%) do (
            rem // Read a line from the file to modify:
            set "LINE=" & set /P LINE=""
            rem // Extract the line number:
            for /F "delims=:" %%N in ("!LINE!") do set /A "FNUM=%%N"
            rem /* Find line in replacement file with the same line number prefix as
            rem    the file to modify; if found, just return it; if not, then return
            rem    original line from file to modify: */
            2> nul findstr /B "!FNUM!:" "!_REPL!" || echo(!LINE!
        )
        endlocal
    )
    
    rem // Return resulting file content:
    if defined _RETF (
        rem // Move temporary file onto return file, if there is such:
        > nul move /Y "%TMPF%" "%_RETF%"
    ) else (
        rem // Display result on console and delete temporary file:
        type "%TMPF%"
        del "%TMPF%"
    )
    
    endlocal
    exit /B
    


0 commentaires