1
votes

Faire écho à plusieurs variables sans espace entre elles

Dans un fichier batch

Est-il possible pour une instruction FOR de faire écho plusieurs fois à certaines variables d'un fichier .txt sur la même ligne et SANS laisser d'espace entre elles? Comment?

Jusqu'à présent, j'ai essayé ceci:

FOR /f "tokens=*" %i in test.txt do (echo | set /p d="%i">>new.txt )

En gros, le test.txt contient un nombre aléatoire dans chaque ligne et je veux faire écho à ces nombres comme un dans un nouveau fichier. Mais il continue à mettre des espaces entre chacun d'eux.


4 commentaires

Qu'est-ce que tu as essayé jusque-là?


Oui c'est possible.


(FOR / f "tokens = *"% i dans (test.txt) faire @set / p "d =% i" nouveau.txt


Vous devez avoir des espaces de fin dans votre fichier test.txt. Dans ma réponse, je démontre cela et vous montre comment supprimer efficacement les espaces de fin.


3 Réponses :


0
votes

Vous pouvez essayer ceci.

@echo off
set str=
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do set "str=!str!%%i"
echo|set /p str=!str!>>new.txt

note, la dernière ligne pourrait être echo! str! >> new.txt mais j'ai simplement utilisé echo | set pour éliminer toute nouvelle ligne.


0 commentaires

0
votes

Il doit y avoir des espaces de fin dans votre fichier source.

Pour résoudre, vous pouvez utiliser quelques méthodes.

1) Utilisez Tokens = 1 dans votre boucle for / F strong>

Notez que cela ne fonctionne que s'il n'y a qu'une seule valeur sur la ligne, et c'est la nième valeur (dans ce cas n = 1).

REM Initial Setup No Spaces:

Y:\>echo.>new.txt
Y:\>echo.4>>test.txt
Y:\>echo.9>>test.txt
Y:\>echo.12>>test.txt
Y:\>echo.7>>test.txt
Y:\>echo.34>>test.txt
Y:\>echo.10>>test.txt

REM Test Original Method and Result:

Y:\>FOR /f "tokens=*" %i in (test.txt) do @(echo.| set /p "d=%~i">>new.txt )

Y:\>type new.txt
491273410

REM Clear Result and Add More values including ones with lots of spaces:

Y:\>echo.>new.txt
Y:\>echo. 9 >>test.txt
Y:\>echo. 11>>test.txt
Y:\>echo.13 >>test.txt
Y:\>echo.17>>test.txt
Y:\>echo.    11>>test.txt
Y:\>echo.            73              >>test.txt
Y:\>echo.19>>test.txt
Y:\>echo.            73           65   >>test.txt
Y:\>echo.8888888888>>test.txt

REM Test Original Method and Result:
Y:\>FOR /f "tokens=*" %i in (test.txt) do @(echo.| set /p "d=%~i">>new.txt )

Y:\>type new.txt
4912734109 1113 171173              1973           65   8888888888

REM Reset Results File, Test New Method, and show results:

Y:\>echo.>new.txt

Y:\>FOR /f "tokens=*" %i in (test.txt) do @(for %I in (%~i) DO @(echo.| set /p "d=%~I">>new.txt ) )

Y:\>type new.txt
491273410911131711731973658888888888
2) Utilisez une deuxième boucle "for" pour supprimer les espaces de fin.

Remarque: La méthode que j'ai choisie supprimera tous les espaces de la ligne, donc si vous en avez deux numéros avec un espace entre eux sur une ligne à dessein, l'espace sera supprimé. Si vous préférez n'attraper que le 1er trimestre ou si vous préférez conserver l'espace dans de telles circonstances, des modifications supplémentaires pourraient être apportées.

Y:\>FOR /f "tokens=*" %i in (test.txt) do @(for %i in (%~i) DO @(echo.| set /p "d=%~i">>new.txt ) )

Y:\>type new.txt
491273410911131711731973658888888888

Ci-dessous, je montre en détail que le problème doit être dû à des espaces de fin et comment la nouvelle méthode gère correctement cela:

FOR /f "tokens=1" %i in (test.txt) do @(echo.| set /p "d=%~i">>new.txt )

Y:\>type new.txt
4912734109111317117319738888888888


0 commentaires

0
votes

Cela supprime tout saut de ligne dans un fichier:

@echo off
SETLOCAL DisableDelayedExpansion EnableExtensions

<nul >NoCRLF.txt (FOR /F useback^ delims^=^ tokens^=*^ eol^= %%L in ("test.txt") do set/p"=%%L")

Limitations

  • Les lignes vides seront ignorées, mais ce n'est pas important ici car tous les \ n ou \ r \ n seront supprimés de toute façon.
  • Les lignes ne peuvent pas commencer par =


0 commentaires