Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Remplacement chaine de caractères lorsque les lignes font plus de 8000 caractères
    Bonjour à tous,

    Je dois remplacer des caractères dans un fichier csv. J'ai réalisé un fichier .batch grâce à ce forum, mais les lignes de mon fichier qui font plus de 8000 caractères ne sont pas traitées et ne sont pas reportées dans mon fichier de sortie.
    J'ai des lignes qui font jusqu'à 28000 caractères.
    Voici le code:

    Code Batch :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo Off
    setlocal enabledelayedexpansion
     
    set FileToCheck=C:\export2.csv
    set OutputFile=C:\exportp.txt
     
    if exist "%OutputFile%" del "%OutputFile%"
    for /f "usebackq delims=~" %%T in ("%FileToCheck%") do (
      echo %%T
      Set TempVar=%%T
      set TempVar=!TempVar:¿=!
      echo !TempVar!>>"%OutputFile%"
      )


    J'ai essayé de couper le fichier en plusieurs morceaux avec des commandes du type : set chaine1=%TempVar:~0,7999% set chaine2=%TempVar:~7999,7999% ...etc, de faire l'opération de remplacement et ensuite de le reconstituer avec un set varfinal=%chaine1%%chaine2 ... etc, mais sans succès !

    Je vous remercie pour vos conseils en vous remerciant!

  2. #2
    Nouveau membre du Club
    Bonjour,

    La longueur maximale de la mémoire tampon de CMD est de 8192 octets
    brutes (-1 EOL -n pour la commande). Au delà la ligne est tout simplement ignorée. Et dans le cas d'une variable, elle serait tronquée à la taille maxi.

    En fait c'est une des limites du batch, si je ne dis pas de bêtises. J'ai essayé de la contourner nativement quand je m'y suis confronté une fois il y a longtemps, et je me suis cassé le nez.
    Le plus facile (si tu veux rester à utiliser du batch), c'est d'utiliser une commande externe, en vbs ou autre, qui te permettrait de contourner le souci pour fournir une variable exploitable à ton traitement, voir pour exploiter.

    A ce jour je ne connais pas de solutions native, mais ce serait intéressant d'en trouver une..

  3. #3
    Expert éminent
    Replace substring inside a text file starting from character and ending with another character

    Peut-être avec cette solution en utilisant le regex du vbscript
    Replace substring inside a text file starting from character and ending with another character

    Code BAT :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @echo off
    Title Replace String using Regex with vbscript
    Set "InputFile=in.csv"
    Set "OutPutFile=out.csv"
    Call :Search_Replace "%InputFile%" "%OutPutFile%"
    Start /MAX Notepad "%OutputFile%" & Exit
    ::-----------------------------------------------------------------------------------
    :Search_Replace <InputFile> <OutPutFile>
    (
        echo WScript.StdOut.WriteLine Search_Replace(Data^)
        echo Function Search_Replace(Data^)
        echo Dim strPattern, strReplace, strResult,oRegExp
        echo Data = "%~1" 
        echo Data = WScript.StdIn.ReadAll
        echo strPattern = "¿"
        echo strReplace = ""
        echo Set oRegExp = New RegExp
        echo oRegExp.Global = True 
        echo oRegExp.IgnoreCase = True 
        echo oRegExp.Pattern = strPattern
        echo strResult = oRegExp.Replace(Data,strReplace^)
        echo Search_Replace = strResult
        echo End Function
    )>"%tmp%\%~n0.vbs"
    cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
    If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
    Exit /B
    ::----------------------------------------------------------------------------------

  4. #4
    Candidat au Club
    Merci à tous les 2!

    Du coup ce matin je suis passé par une macro sous VBA. J'ai ensuite fait un vb script qui ouvre ma feuille excel et exécute la macro de remplacement de caractère. Cela fonctionne, mais c'est un peu lourd et nécessite que je baisse la sécurité des macros ....

    Je vais tester demain la solution de hackoofr qui du coup me semble pas mal du tout et surtout plus simple!
    Merci!


  5. #5
    Candidat au Club
    Merci hackoofr, cela marche parfaitement et super rapidement en plus.

  6. #6
    Candidat au Club
    Retour Chariot
    le code donné par hackoofr marche trés bien mais il m'ajoute un retour de chariot en fin de fichier.
    Une idée pour ne pas avoir ce retour chariot, et donc cette ligne en plus vide ?

    Merci !

  7. #7
    Candidat au Club
    trouve
    J'ai trouvé la solution avec un peu de recherche, pour ceux que cela peut dépanner.
    Je passe par un script vbs pour enlever les lignes vides:

    Code VBS :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    Const cteLecture = 1
    Const cteEcriture = 2
    Const cteFichierSrc = "C:\export_bat\out4.csv"
    Const cteFichierDes = "C:\export_bat\export.csv"
    
    	Dim objFSO, objFichierSrc, objFichierDes, Texte
    
    
    
    	Set objFSO = CreateObject("Scripting.FileSystemObject")
    	Set objFichierSrc = objFSO.OpenTextFile(cteFichierSrc, cteLecture)
    	Set objFichierDes = objFSO.CreateTextFile(cteFichierDes, cteEcriture)
    
    	While Not objFichierSrc.AtEndOfStream
    		Texte = objFichierSrc.ReadLine
    		Texte = Trim(Texte)
    		If ( Len(Texte) > 0 ) Then
    			objFichierDes.Writeline Texte
    		End If
    	Wend
    
    	objFichierSrc.Close
    	objFichierDes.Close
    
    	Set objFichierSrc = Nothing
    	Set objFichierDes = Nothing
    	Set objFSO = Nothing
    
    WScript.Quit(0)


    Cela a résolu mon problème.

###raw>template_hook.ano_emploi###