IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Scripts/Batch Discussion :

Batch - For Tokens et whitespaces


Sujet :

Scripts/Batch

  1. #1
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut Batch - For Tokens et whitespaces
    Bonjour a tous,
    Je suis confronte a un probleme lors de la transformation d'un fichier CSV en Batch:
    Code : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    @echo off
    title Business Partner - CSV Transformation
    
    cls
    set newfile=BPTransform.csv
    set counter=0
    
    for /f "tokens=* delims=;" %%a in ( BPartner.csv ) do set line=%%a &call :setcontent
    
    :setcontent
    REM --------------------
    REM Set content
    REM --------------------
    echo %counter%
    if /i "%counter%" equ "0" call :setheader
    pause
    
    echo %line% > line.tmp
    for /f "tokens=1-20,* delims=;" %%a in ( line.tmp ) do set line=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%r;%%s;%%t;%%u;toto;%%v
    echo %line%
    del line.tmp
    
    REM --------------------
    REM Add line
    REM --------------------
    echo ZECI_STR_BUPA_UPLOAD_I;%line% >> %newfile%
    set /a counter+=1 
    goto :eof
    
    :setheader 
    REM --------------
    REM Add the header
    REM --------------
    echo %line% > line.tmp
    for /f "tokens=1 delims=;" %%b in ( line.tmp ) do echo ZECI_CONTAINER_I;%%b; >> %newfile%
    del line.tmp
    goto :eof
    
    :end
    En realite, dans la boucle de set content (pas tres propre, je l'avoue), j'aimerai conserver les espaces mais FOR /F les supprime.

    Exemple:
    A;;C...etc
    Dans ce cas B doit etre egal a ''. Est-ce possible de resoudre ce probleme ?
    J'ai essaye des doubles boucles imbriquees .. pas mieux.

    Vous remerciant,
    L.

  2. #2
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Hum, weird, il n'y a aucune raison que les espaces soient supprimés par un for /f, je viens de tester sur un exemple simplifié et mes espaces sont conservés.

    Tu peux nous donner un fichier csv source ?

    Btw, tu peux simplifier un peu ton appel à :setcontent en passant ta ligne en paramètre plutôt qu'en passant par une variable. Tu dois aussi pouvoir te défaire du ligne.tmp (tu peux faire des for sur des chaines)

  3. #3
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Merci pour ton aide, voici le fichier en question.
    L.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Bon j'ai un peu modifié ton code et moi il me garde les espaces. Enfin j'ai peut être pas compris ton problème, vu que dans ton csv exemple il n'y avait pas le cas ; ;


    Code : 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
    32
    @echo off
    title Business Partner - CSV Transformation
    
    cls
    set newfile=BPTransform.csv
    set counter=0
    
    for /f "delims=" %%a in ( BPartner.csv ) do call :setcontent "%%a"
    
    :setcontent
    REM --------------------
    REM Set content
    REM --------------------
    if %counter%==0 call :setheader %1
    
    for /f "tokens=1-20,* delims=;" %%a in ( %1 ) do set line=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%r;%%s;%%t;%%u;toto;%%v
    
    REM --------------------
    REM Add line
    REM --------------------
    echo ZECI_STR_BUPA_UPLOAD_I;%line% >> %newfile%
    set /a counter+=1 
    goto :eof
    
    :setheader 
    REM --------------
    REM Add the header
    REM --------------
    for /f "tokens=1 delims=;" %%b in ( %1 ) do echo ZECI_CONTAINER_I;%%b; > %newfile%
    goto :eof
    
    :eof
    Quelques remarques :
    - Dans setheader utilise > au lieu de >> pour ecraser si le fichier existe déjà (sinon il ajoute à la suite).
    - Ton %v ne sert à rien la vu que le dernier token est %u.
    - J'imagine que tu effectues d'autres transformations que ce qui est décrit la, car si tu veux recopier toute la ligne, je ne vois pas l'interet de cette seconde boucle dans setcontent.

    Par contre la, comme dans ton code, il supprime les entrées en ;;. C'était peut être cela ton problème ? Mais dans ce cas je ne vois pas pourquoi tu parles d'espaces :/
    Quel transformation veux-tu faire exactement sur ta ligne ??

  5. #5
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Bonjour.
    Oui en effet, pour moi un espace est represente par ;; ou ; ; et c'est bien mon probleme. J'ai bien d'autres transformations a faire sur ce fichier : il s'agit d' un script pour preparer un upload massif dans LSMW (SAP) - decoupage, ajout de headers et pre-validation du formatage.

    Te remerciant,
    L.

  6. #6
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Ok,

    Effectivement c'est plus génant, le FOR n'assigne pas de variables à null ce qui fait qu'il ignore les ;;.

    Une solution peut être l'utilisation de sed (commande unix mais dont tu peux trouver une version windows).
    En amont tu remplaces, soit directement avant de lire le fichier source, soit à chaque ligne (à voir aussi selon la taille de ton csv), les ;; par ;#38#; (par exemple, il faut une chaine dont tu sois sur qu'elle ne puisse pas apparaître dans ton fichier source).
    Tu effectues ensuite l'opération inverse, au moment qui t'arrange le plus dans ton script.

    En attendant de trouver mieux...

  7. #7
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Mon fichier fait 800Mo - si je comprend bien, sed assigne des variables nulles ?
    Je pensais gagner du temps en utilisant un langage script mais si je dois coder en C, autant debuter des maintenant.

    Teremerciant une nouvelle fois,
    L.

  8. #8
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    800Mo effectivement oublie sed.

    Sed est un utilitaire qui permet de faire des remplacements de chaînes en utilisant les expressions régulières.

    Sur un fichier de 800Mo, il va mourir.
    Tu peux essayer ligne par ligne, il restera en vie mais ça risque d'être un peu long...

    A toi de voir, si c'est un script à utiliser une fois, et selon ton niveau en C, tu iras peut etre plus vite à utiliser sed (niveau code c'est simple).
    Sinon je te conseille effectivement d'utiliser autre chose. De toute façon pour un fichier de 800Mo, je doute que le Batch soit le plus adapté.

  9. #9
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Merci pour ton aide si precieuse.
    L.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BATCH] FOR /F "tokens=*" -> *" était inattendu.
    Par s4nji dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 01/08/2012, 10h29
  2. batch - for, skip est il limité ?
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 17/06/2007, 19h07
  3. help FOR tokens=1,2* et le caractére *
    Par koKoTis dans le forum Windows
    Réponses: 4
    Dernier message: 10/08/2006, 17h08
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo