J'ai écrit un programme de lots qui échange une ligne d'un fichier Le premier, Le deuxième fichier .txt ( .txt code>.
J'ai deux
.txt code> fichiers:
test1.txt code> contient l'enregistrement qui ressemble à ceci: p>
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
)
)
5 Réponses :
Je suggérerais le code suivant pour cette tâche: Tout d'abord, faisant une boucle pour trouver le mot remplacé, puis remplacer par une autre boucle. P> Un autre WAY, vous pouvez souhaiter, c'est trouver la troisième ligne des deux fichiers ou simplement en supposant que supposant ce qui précède, le Code suivant fonctionne: p> si votre fichier Si la même chose se produit avec le fichier test2.txt code> n'a qu'une seule ligne mentionnée dans votre question. p>
test1.txt code> ne contient pas
n: code> remplacer
(echo% line_number%:% Remplacer%%) >> "test1.txt" code> avec
(echo% remplacer%) >> "test1.txt" code> dans Tous les cas Strong>. p>
test2.txt code>, remplacez
pour / f "jetons = 2 Delims =:" %% A in (test2. txt) faire ( code> avec
pour / f "delims =" %% A in (test2.txt) do ( code> dans tous les cas forts>. p> << p> et en supposant que la valeur stockée dans
remplacer la variable code> est dans la troisième ligne, utilisez: p>
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 code>.
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?
IIUR Le fichier Je lirais les remplaçants dans un tableau et vérifiez si l'on existe une fois itération Le fichier De cette façon, vous pouvez avoir plusieurs remplacements (et un texte plus long) p> donné ces fichiers d'échantillon: P> < Pré> xxx pré> Ce lot: p> donne cette sortie: p> test2.txt code> contient le numéro de ligne à remplacer et le texte de remplacement séparé par un côlon.
text1.txt code> p>
Bonjour, j'ai essayé votre solution. Dans l'écho, la sortie est affichée correctement, mais rien n'est écrit dans le test1.txt?
avec Cela devrait émettre ce que vous voulez test1.txt code> et
test2.txt code> comme dans votre question, vous pouvez avoir ceci comme
test.cmd code>:
Test3.txt Code>. P> P>
C'est comme ça que je le ferais:
Voici une version plus générique qui permet au fichier de remplacement ( Ceci est le code du script, appelons-le 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> test2.txt code>) pour contenir plus d'une ligne, en fonction des hypothèses suivantes:
test1.txt code>) contient moins de 2 31 sup> lignes; li>
remplacer-numéroté-lignes.bat code>: 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
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?