FOR sur une liste qui a des champs vides

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Répondre
un_mec
Batcheur occasionnel
Messages : 2
Enregistré le : 17 mars 2011 11:11

FOR sur une liste qui a des champs vides

Message par un_mec »

Bonjour,

Je suis en train d'écrire un bat pour filtrer des données d'une base de donnée exportée en csv selon la valeur du 3eme champ (si le 3eme champ a cette valeur, je recopie la ligne dans un autre fichier, sinon je passe à la ligne suivante). Le problème étant que certains de ces champs sont vides.

Globalement, j'ai a disposition des fichiers du type

val1;val2;val3;val4
val5;val6;;val7
val8;;val9;val10

J'utilise une boucle for du genre :

Code :

Code : Tout sélectionner

for /f "tokens=1-4 delims=;" %%a in fichier) do ( 
    if %%c==%valeur que je veux% ( 
        echo %%a;%%b;%%c;%%d>>%autre_fichier%
    )
)
Mon problème est que quand il y a deux delims cote à cote (champ vide), il ne considère pas un token vide entre les deux. Donc pour la seconde ligne de mon fichier, le script considère ca :
%%a = val5
%%b = val6
%%c = val7
%%d = "" (il ne considère pas de 4eme champ)
alors que je voudrais ca :
%%a = val5
%%b = val6
%%c = "" (chaine vide)
%%d = val7

J'ai eu beau chercher sur google, puis sur batcher.fr, je ne trouve pas la moindre piste de solution alors que j'ai trouvé quelques posts sur le même problème.
Bref si vous avez des suggestions, elles sont bienvenue, et merci d'avance pour votre aide !
un_mec
Batcheur occasionnel
Messages : 2
Enregistré le : 17 mars 2011 11:11

Re: FOR sur une liste qui a des champs vides

Message par un_mec »

Finalement je m'en suis sorti par une méthode détournée qui remplace les ;; par ;#;. Pour information si quelqu'un tombe sur ce message, voila comment j'ai fait :

Code : Tout sélectionner

for /f "delims=" %%1 in (fichier) do ( 
    set ligne_mem=%%1
    set ligne=!ligne_mem:;;=;#;!
    call traitement_ligne.bat

    for /f "tokens=1-4 delims=;" %%a in ("!ligne!") do ( 
        if %%l==%team% (
            set ligne_mod=%%a;%%b;%%c;%%d
            set ligne_mod=!ligne_mod:#=!
            echo ligne_mod>>%autre_fichier%
        )
    )
)
 
où traitement_ligne.bat est :

Code : Tout sélectionner

if not !ligne! EQU !ligne_mem! ( set ligne_mem=!ligne!
    set ligne=!ligne:;;=;#;!
    call traitement_ligne.bat )
 
Au départ, j'avais mis le code de traitement_ligne dans un label qui s'appellait au lieu d'un fichier bat à part qui s'appelle, mais j'avais des erreurs que je n'arrivait pas à résoudre, et c'est toujours un mystère (seulement les deux premieres lignes du fichier étaient lues...)
Répondre