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] Lecture de fichier avec caractères spéciaux


Sujet :

Scripts/Batch

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 73
    Points
    73
    Par défaut [Batch] Lecture de fichier avec caractères spéciaux
    Bonjour à tous,

    Je ne suis pas sans savoir que les caractères spéciaux ont déjà donnés lieu à de nombreuses questions, et par conséquent, à de nombreuses et excellentes réponses.
    Cependant, je n'ai malheureusement pas réussi à trouver une solution à mon problème dans cette mine d'information.

    En fait, la commande suivante ne termine jamais et n'affiche rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For /f "delims=" %%i in ('Type "%nomFic%"') Do Echo %%i
    La petite particularité est que le fichier "nomFic" est un "semi-binaire".
    J'entends par là qu'il contient des fins de ligne ("LF" seul) permettant, logiquement d'en effectuer le parcours ligne à ligne.
    Cependant, sur chacune de ces lignes, on passe en revue tout le spectre des caractères spéciaux (D'après Notepad++, on a notamment ETX, NUL, STX, SYN, DC4, EOT, NAK, SOH, BS, ENQ, GS, BEL, SI, ACK, ESC, DC2... ainsi que tous les caractères accentués possibles et imaginables).
    Hors, ceux-ci n'ont aucun intérêt pour moi et semblent nuire au fonctionnement.

    Par conséquent, mes interrogations sont les suivantes :
    - Existe-t-il une méthode pour échapper tous les caractères spéciaux (hors "LF") ?
    - Est-il possible d'appliquer cette éventuelle méthode à la volée ou sur tous le fichier (pas d'action manuelle) ?

    D'avance merci de votre retour,

    Bien cordialement,

    Altrensa

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Je viens de me rendre compte que le script finissait bien par réagir mais 5 minutes après son lancement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Echo "Lancement de la boucle de traitement"
    Set numLigne=1
    For /F "tokens=*" %%i in ('Type "%nomFic%"') Do (
    Echo "Debut du traitement de la ligne !numLigne!"[...]
    En effet, entre le "Lancement de la boucle de traitement" et le "Début du traitement de la ligne xxx", il y a un long temps.

    Quelqu'un sait d'où cela pourrait provenir ?

    Note : Ma question d'échappement des caractères spéciaux reste d'actualité.

    Merci beaucoup,

    Cordialement.

    Altrensa

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Bonjour à tous,

    En fait, je n'ai pas solutionné mon problème mais je l'ai éludé.
    Je faisais une boucle "ligne à ligne" qui semblait être lente (voire en anomalie mais sans erreur) à cause des trops nombreux caractères spéciaux de mon fichier.
    Il fallait donc que je puisse travailler sans passer par une boucle "ligne à ligne".

    Voici mon algo de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Lecture ligne 1 du fichier
    => Recherche chaine
    => Ecriture, si chaine trouvée, de la ligne 1 dans le fichier de sortie
    J'ai donc remplacé cet algo par un ne nécessitant pas de boucle, et ce grâce à la merveilleuse commande "Find" qui a avantageusement remplacée la commande "FindStr". Voici donc l'algo modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Recherche de la chaine dans tout le fichier
    => Ecriture en sortie de toutes les lignes contenant la chaine
    Soit, en batch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Find %CHAINE% %FILE% >>%FILE_SORTIE%
    En plus d'être beaucoup plus rapide et de n'avoir aucune pause, cette méthode permet de ne pas être géné par le caractère "semi-binaire" de mon fichier.

    En un mot, le top !

    Note : la commande "Find" ajoute deux lignes au début du fichier, une vide et une avec le nom du fichier de départ, précédé de quelques caractères "-".
    Il est assez facile de contourner ce problème de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Echo Recherche de toutes les lignes que nous voulons
    Find %CHAINE% %FILE% >>%FILE_SORTIE%_TMP
    Echo Suppression des lignes en trop
    for /F "skip=2 delims=" %%i in (%FILE_SORTIE%_TMP) do echo %%i >>%FILE_SORTIE%
    del %FILE_SORTIE%_TMP
    J'espère que cela pourra servir à quelqu'un,

    Bien cordialement,

    Altrensa

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    A titre d'information additionnelle, je viens de me rendre compte d'une limite de cette méthode : on ne peut traiter correctement des lignes de plus de 4096 caractères.
    Le problème est débattu dans la discussion suivante : ici

    Bien cordialement,

    Altrensa

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

Discussions similaires

  1. [PowerShell] suppression de fichier avec caractère spéciaux
    Par wolfaste dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 17/10/2014, 09h36
  2. lire fichier avec caractères spéciaux
    Par expertax dans le forum Linux
    Réponses: 1
    Dernier message: 25/05/2011, 12h01
  3. lecture fichier disque dur avec caractères spéciaux.
    Par faitgaffe dans le forum Langage
    Réponses: 1
    Dernier message: 14/03/2010, 20h48
  4. Lecture de fichier ligne par ligne avec caractères spéciaux
    Par Australia dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 28/11/2007, 15h30
  5. [DOM] Erreur parser fichier xml avec caractère spéciaux
    Par turcotm dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/06/2006, 09h01

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