locked
[Résolu] Rajout de caractere via Batch RRS feed

  • Question

  • Bonjour,

    J'ai actuellement un problème lors de la configuration d'un bout de batch, voici la ligne:

    for /f %%a in ('type texte.txt') do (echo %%a;) >> text.csv

    La ligne rajoute le ";" a la fin de la ligne mais ne prend que le premier mot de chaque ligne, exemple:

    "Nom" deviens "Nom;"
    "Numero de compte" deviens "Numero;"

    Vous auriez une solution pour la transformer de sorte a ce que j'ai toute la ligne de prise?


    mardi 1 décembre 2015 08:25

Réponses

  • Ensuite j'aurais aimé tout mettre sur une même ligne

    Je viens de comprendre, c'est le résultat qui doit être sur la même ligne, pas la commande
    (suis pas très réveillé aujourd'hui)

    dans ce cas, en batch:

    setlocal enabledelayedexpansion

    FOR /F "usebackq delims=*" %%a in ("C:\Chemin fichier\texte.txt") do (
    set Output=!Output!%%a;
    )

    echo %Output%>>Text.csv

    en powershell:

    Get-Content -Path C:\Dossier\texte.txt | foreach {($_.TrimEnd()) -replace "^(.+)$", '$1;'} | out-file -FilePath C:\Dossier\texte.csv -append -NoNewLine

    Voilà


    mardi 1 décembre 2015 20:00

Toutes les réponses

  • Par défaut, FOR /F utilise l'espace comme séparateur de champs.
    Il te faut trouver un caractère qui ne se trouve pas dans ton fichier texte comme séparateur de champs.

    L’astérisque par exemple (*)

    De plus, tu peux parcourir ton .TXT sans utiliser TYPE

    FOR /F "delims=*" %%a in (texte.txt) do (
    echo %%a;>>Text.csv
    )

    Avec cette méthode, si des espace se trouve dans le nom ou le chemin du fichier lu, tu devras mettre celui-ci entre guillement, comme ceci:

    FOR /F "delims=*" %%a in ("C:\Chemin fichier\texte.txt") do (
    echo %%a;>>Text.csv
    )

    Cela ne fonctionnera pas tel-quel, FOR lira les éléments de la chaîne

    "C:\Chemin fichier\texte.txt"

    et non le fichier texte.

    Il te faut pour corriger cela utiliser l'option USEBACKQ, comme ceci:

    FOR /F "usebackq delims=*" %%a in ("C:\Chemin fichier\texte.txt") do (
    echo %%a;>>Text.csv
    )

    Dernière chose, si il y a des caractères accentués dans ton fichier texte, enregistre-le avec le codage OEM (code page 850) avec Notepad2 par exemple.

    mardi 1 décembre 2015 08:55
  • Bonjour,

    Merci, effectivement le résultat y es, cependant j'ai un espace entre ma chaine et mon ";"

    Je m'explique, voici un texte d'origine:

    Salut
    Je suis
    Un pantin

    Cela apparait comme ça :

    Salut ;
    Je suis ;
    Un pantin ;

    J'aimerais retirer cette espace entre la chaine de caractère et mon caractère.

    Ensuite j'aurais aimé tout mettre sur une même ligne, admettons la ligne précédente deviendrait:

    Salut;Je suis;Un pantin;

    J'ai trouvé une commande avec sed qui permet de le faire:

    sed :a;N;$!ba;s/\n//g text.csv > final.csv

    Or cela m'oblige a installer sed, il y a-t-il un équivalent avec l'invite de commande Windows?

    Merci pour tout.

    mardi 1 décembre 2015 13:21
  • Bonjour,

    Merci, effectivement le résultat y es, cependant j'ai un espace entre ma chaine et mon ";"

    Je m'explique, voici un texte d'origine:

    Salut
    Je suis
    Un pantin

    Cela apparait comme ça :

    Salut ;
    Je suis ;
    Un pantin ;

    J'aimerais retirer cette espace entre la chaine de caractère et mon caractère.

    Si il y a un espace, c'est parce que il se trouve dans ton code et qu'il est injecté dans ton résultat!

    Si tu regarde bien mes lignes de code, il n'y a pas d'espace entre le ; et le premier >

    Et pour mettre sur une seule ligne, pas de problème:

    FOR /F "usebackq delims=*" %%a in ("C:\Chemin fichier\texte.txt") do (echo %%a;>>Text.csv  )

    • Modifié Bawilanemo mardi 1 décembre 2015 13:49
    mardi 1 décembre 2015 13:47
  • J'y avais pensé et ai vérifié et testé mais non, cela ne viens pas de là, avec la ligne suivante j'ai le problème quand même:

    for /f "usebackq delims=°" %%a in (text.csv) do (echo %%a;>>final.csv)

    mardi 1 décembre 2015 14:07
  • C'est que l'espace s'y trouve avant trnsformation, je ne vois pas comment d'autre il pourrait apparaitre!

    Pour sed, pas de besoin de tool supplémentaire, Powershell le fait très bien:

     Get-Content -Path C:\Dossier\texte.txt | foreach {($_.trimend()) -replace "^(.+)$", '$1;'} | out-file -FilePath C:\Dossier\texte.csv -append

    avec suppression des espace à la fin, s'il y en a


    • Modifié Bawilanemo mardi 1 décembre 2015 14:31
    mardi 1 décembre 2015 14:30
  • Effectivement, j'ai trouvé une itération du script un peu en amont ou il y a un espace qui s'ajoute, c'est résolu! Merci beaucoup

    Il ne me reste plus que cette histoire de tout ramener sur la même ligne, le bout de Powershell n'as pour effet que de me rajouter ";" a la fin de chaque ligne.

    Maintenant que mon resultat est sous la forme:

    Salut;
    Je suis;
    Un pantin;

    J'aimerais le mettre sous la forme :

    Salut;Je suis;Un pantin;
    Tout mettre sur la meme ligne à la suite, supprimer les retour chariot en gros. Une idée?
    mardi 1 décembre 2015 16:31
  • Ensuite j'aurais aimé tout mettre sur une même ligne

    Je viens de comprendre, c'est le résultat qui doit être sur la même ligne, pas la commande
    (suis pas très réveillé aujourd'hui)

    dans ce cas, en batch:

    setlocal enabledelayedexpansion

    FOR /F "usebackq delims=*" %%a in ("C:\Chemin fichier\texte.txt") do (
    set Output=!Output!%%a;
    )

    echo %Output%>>Text.csv

    en powershell:

    Get-Content -Path C:\Dossier\texte.txt | foreach {($_.TrimEnd()) -replace "^(.+)$", '$1;'} | out-file -FilePath C:\Dossier\texte.csv -append -NoNewLine

    Voilà


    mardi 1 décembre 2015 20:00
  • Tout est fonctionnel! Je te remercie beaucoup, tip top ;)
    mercredi 2 décembre 2015 06:58