Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupération des données d'un fichier TXT

En script Shell/Bash

    19 octobre 2023 à 16:19:36

    Hello ! 

    Je commence à m'intéresser au scripting shell/bash mais il n'y a quelque chose que je ne comprends pas. 

    Sur windows par exemple, si je veux lire le contenu d'un fichier, je peux utiliser "less" via PowerShell. 

    Cependant, si je crée un script avec un blocnote que j'ouvre via un terminal de commande, la commande less ne va pas fonctionner. 

    J'ai par exemple un fichier test.txt comme ceci : 

    France
    Costa Rica
    Belgique
    Suisse
    Espagne
    Colombie
    Canada
    Brésil
    Islande
    Nicaragua 
    

    Le but est de récupérer le contenu de se fichier via mon script et de l'afficher dans un premier temps. 

    Dans mon script j'ai créé une boucle comme celle-ci : 

    @echo_off
    
    cls
    
    FOR /F %%i in ('type test.txt') do echo %%i
    
    pause

    Cependant ça ne va pas car ça me les affichent une par une (vu que j'utilise un FOR), alors que via less ça m'affiche toutes les données d'un coup. 

    Je n'arrive pas à "intégrer" l'ensemble des valeurs récupérer dans le FOR dans une variable. 

    J'ai un peu de mal avec la syntaxe car sur les différents sites que je regarde, il y'a toujours des différences. 

    Une idée ? 

    Si vous avez un lien vers un cours clair sur le script je suis preneur également ! :ange:

    • Partager sur Facebook
    • Partager sur Twitter
      19 octobre 2023 à 16:34:32

      Là si tu fais juste "type test.txt" ça va tout t'afficher en une fois pas besoin de boucle.

      Tout va dépendre du but de ton script, ton FOR te permet de lire ligne par ligne le fichier (d'ailleurs,  tu n'as pas besoin de la commande type pour ça, le FOR le fait par lui même).

      Si tu veux récupérer tout le contenu dans une variable

      set /P Variable=<File.txt
      echo %variable%

      https://stackoverflow.com/a/31283158  



      • Partager sur Facebook
      • Partager sur Twitter
        21 octobre 2023 à 15:08:05

        umfred a écrit:

        Là si tu fais juste "type test.txt" ça va tout t'afficher en une fois pas besoin de boucle.

        Tout va dépendre du but de ton script, ton FOR te permet de lire ligne par ligne le fichier (d'ailleurs,  tu n'as pas besoin de la commande type pour ça, le FOR le fait par lui même).

        Si tu veux récupérer tout le contenu dans une variable

        set /P Variable=<File.txt
        echo %variable%

        https://stackoverflow.com/a/31283158  




        Merci pour ton retour ! Le but était d’ouvrir deux fichiers textes et de comparer les chaînes de caractères. 

        Tu connais des sites avec de bons cours pour tout ça ? J’ai l’habitude du Python et j’avoue que ça me perturbe un peu aha

        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2023 à 15:12:22

          j'ai pas vraiment de cours à te donner, je fais ma recherche souvent.

          Après dans une invite de commande si tu tapes help, on y voit la commande cmp qui permet de comparer des fichiers (cmp --help pour voir son aide).
          Si tu veux comparer 2 fichiers, il faut les ouvrir tous les 2, et les parcourir donc 2 boucles imbriquées.
          Reste à savoir comment tu veux faire ta comparaison: ligne à ligne, contenu des lignes, .....

          • Partager sur Facebook
          • Partager sur Twitter
            23 octobre 2023 à 16:32:45

            Hmmm c'était surtout pour faire un test, comparer deux chaines de caractères et afficher si elles sont identiques ou non. 

            J'ai tenté ton script pour afficher le contenu de mon fichier txt : 

            @echo_off
            
            set /P variable=<test.txt
            echo %variable%
            
            pause
            

            Malheureusement seul le mot "France" apparait lors du lancement de la commande. 

            Je m'y prends peut être super mal pour le coup. 

            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2023 à 17:31:18

              Je n'avais pas testé avec un fichier de plusieurs lignes (je m'étais contenté de reprendre la réponse du sujet SO dont j'ai mis le lien)

              donc il faudra passer par le FOR

              FOR /F "tokens=1 delims=" %%a in (test.txt) do echo %%a
              pause

              Il faudra sûrement aussi en début la ligne 

              SETLOCAL EnableDelayedExpansion

              (peut être voir ce site https://ss64.com/nt/for_f.html 


              • Partager sur Facebook
              • Partager sur Twitter
                23 octobre 2023 à 19:40:15

                Bonsoir,

                Pour la modification d'une ligne dans un fichier texte, tu peux t'inspirer des scripts ci-dessous :

                Modif file by line (multiple regex) :

                @echo off
                setlocal EnableDelayedExpansion
                echo.
                
                REM Fichier de configuration
                set file_tmp=provFile.ini
                
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                	REM Correspond à l'emplacement/chemin du fichier à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
                	set path_file=C:\Users\erwan\Desktop\Programmation\Batch\Code exemple\Modification de fichier texte
                
                	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
                	set file=test.txt
                
                	REM Correspond à la ligne recherchée 1 (REGEX findstr; pas de guillemets)
                	set file_line_regex[1]=domain=
                
                	REM Correspond à la nouvelle ligne 1 (pas de guillemets)
                	set file_line_replace[1]=domain=1234
                	
                	REM Correspond à la ligne recherchée 2 (REGEX findstr; pas de guillemets)
                	set file_line_regex[2]=username=
                
                	REM Correspond à la nouvelle ligne 2 (pas de guillemets)
                	set file_line_replace[2]=username=1234
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                
                cd /D "%path_file%"
                If not exist "%file%" (goto :file_notfound)
                If exist "%file_tmp%" (del /F /Q "%file_tmp%")
                
                For /f "delims=" %%i in ('type "%file%"') do (
                	call :replace "%%i"
                )
                
                del /F /Q "%file%"
                rename "%file_tmp%" "%file%"
                echo Modification termin‚e ^^!
                goto :quit
                
                :replace
                set line=%*
                set "b_replace=False"
                For /L %%j in (1,1,2) do (
                	echo !line! | findstr /RC:"!file_line_regex[%%j]!" >nul
                	If !errorlevel! EQU 0 (
                		set "b_replace=True"
                		echo !file_line_replace[%%j]!>>"%file_tmp%"
                	)
                )
                if "%b_replace%"=="False" (echo !line:~1,-1!>>"%file_tmp%")
                GOTO:EOF
                
                :file_notfound
                echo Le fichier "%file%" est introuvable ^^!
                
                :quit
                echo.
                pause>nul | echo Appuyez sur une touche pour quitter le script...
                exit 

                Modif file by line (word-find) :

                @echo off
                setlocal EnableDelayedExpansion
                echo.
                 
                REM Fichier de configuration
                set file_tmp=provFile.ini
                
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                	REM Correspond à l'emplacement/chemin du fichier à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
                	set path_file=C:\Users\erwan\Desktop\Programmation\Batch\Code exemple\Modification de fichier texte
                	
                	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
                	set file=test.txt
                 
                    REM Correspond à la ligne recherchée (word find ; pas de guillemets)
                    set file_line_find=^<Word-Find^>C:\ProgramData\Directory\Data\^</Word-Find^>
                 
                    REM Correspond à la nouvelle ligne (pas de guillemets)
                    set file_line_replace=^<coucou^>
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                
                cd /D "%path_file%"
                If not exist "%file%" (goto :file_notfound)
                If exist "%file_tmp%" (del /F /Q "%file_tmp%")
                 
                For /f "delims=" %%i in ('type "%file%"') do (
                    set line="%%i"
                    echo !line! | find "!file_line_find!" >nul
                    If !errorlevel! EQU 1 (
                        echo %%i>>"%file_tmp%"
                    ) else (
                        echo !file_line_replace!>>"%file_tmp%"
                    )
                )
                
                del /F /Q "%file%"
                rename "%file_tmp%" "%file%"
                echo Modification termin‚e ^^!
                goto :quit
                 
                :file_notfound
                echo Le fichier "%file%" est introuvable ^^!
                 
                :quit
                echo.
                pause>nul | echo Appuyez sur une touche pour quitter le script...
                exit
                

                Modif file by line (number) :

                @echo off
                echo.
                
                REM Fichier de configuration
                set file_tmp=provFile.ini
                
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                	REM Correspond à l'emplacement/chemin du fichier à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
                	set path_file=C:\Users\erwan\Desktop\Programmation\Batch\Code exemple\Modification de fichier texte
                	
                	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
                	set file=test.txt
                
                	REM Correspond à la ligne recherchée (numéro de ligne ; pas de guillemets)
                	set /a file_line_number=2
                
                	REM Correspond à la nouvelle ligne (pas de guillemets)
                	set file_line_replace=Ce Que Je Veux Mettre Pour Remplacer La Ligne
                ::::::::::::: VARIABLE A MODIFIER :::::::::::::
                
                cd /D "%path_file%"
                If not exist "%file%" (goto :file_notfound)
                If exist "%file_tmp%" (del /F /Q "%file_tmp%")
                
                (FOR /f "tokens=1* delims=:" %%a IN ('findstr /n "^" "%file%"') DO (
                    SET "Line=%%b"
                    IF %%a equ %file_line_number% SET "Line=%file_line_replace%"
                    setlocal EnableDelayedExpansion
                    ECHO(!Line!
                    endlocal
                ))>"%file_tmp%"
                )
                
                del /F /Q "%file%"
                rename "%file_tmp%" "%file%"
                echo Modification termin‚e ^!
                goto :quit
                
                :file_notfound
                echo Le fichier "%file%" est introuvable ^!
                
                :quit
                echo.
                pause>nul | echo Appuyez sur une touche pour quitter le script...
                exit
                



                -
                Edité par Zaibai 23 octobre 2023 à 19:41:39

                • Partager sur Facebook
                • Partager sur Twitter

                Récupération des données d'un fichier TXT

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown