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

Shell et commandes POSIX Discussion :

decoupage en colonnes de 128 caractères


Sujet :

Shell et commandes POSIX

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut decoupage en colonnes de 128 caractères
    Bonjour,

    Je un fichier format UNIX : sur une seule ligne.
    Je cherche a insérer dans ce fichier tous les 128 caractères un caractère "\r" pour avoir un fichier de x ligne chacune d'une longueur de 128 caractère + ce caractère de fin de ligne.
    Le nombre de caractère du fichier est toujours un modulo de 128.
    lorsque j'utilise la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fold -w 128 mon-fichier
    l'insertion n'est pas parfaite certaine ligne font plus de 128caractères.
    Le problème est probablement lié aux caractères codé laissant apparaitre des qui semble pertuber le process de fold.

    Je cherche une solution a ce problème.

    Je pensais à une boucle de lecture caractère par caractère avec un et est une extraction du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     newligne = 'echo $ligne | cut 1-128'
    .

    Je n'ai aucun langue de haut niveau disponible , seul solution les commande AIX de base

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je réponds un peu au pied levé (pas testé ni rien), est-ce qu'un truc comme ça fonctionne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/(.{128})/\1\n/g' fichier

  3. #3
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut CEla ne marche pas
    Voici le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/(.{128})/\1\n/g' fichier
    sed: illegal option -- r

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  's/(.{128})/\1\n/g' fichier
    sed: Function s/(.{128})/\1\n/g cannot be parsed.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par dedalios Voir le message
    sed: illegal option -- r
    effectivement, au temps pour moi

    Citation Envoyé par dedalios Voir le message
    l'insertion n'est pas parfaite certaine ligne font plus de 128caractères.
    Le problème est probablement lié aux caractères codé laissant apparaitre des qui semble pertuber le process de fold.
    en fait je ne suis pas certain de comprendre, tu aurais un exemple concret éventuellement (et le résultat que tu attendrais si tout se passe bien) ?

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    effectivement, au temps pour moi


    en fait je ne suis pas certain de comprendre, tu aurais un exemple concret éventuellement (et le résultat que tu attendrais si tout se passe bien) ?

    voici ce qui peut pauser problème " ¯yåètœHG Œ9" impossible de mettre d'autre information.

    Le fichier est un fichier d'une seule ligne contenant des éléments qui ne sont pas des caractères ascci. pour autant j'ai besoin d'injecter tous les 128 caractères une fin de ligne
    et je ne dispose que des ressources UNIX de base .

  6. #6
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut cas
    Citation Envoyé par BufferBob Voir le message
    effectivement, au temps pour moi


    en fait je ne suis pas certain de comprendre, tu aurais un exemple concret éventuellement (et le résultat que tu attendrais si tout se passe bien) ?

    voici ce qui peut pauser problème " ¯yåètœHG Œ9" impossible de mettre d'autre information.

    Le fichier est un fichier d'une seule ligne contenant des éléments qui ne sont pas des caractères ascci. pour autant j'ai besoin d'injecter tous les 128 caractères une fin de ligne
    et je ne dispose que des ressources UNIX de base .


    je pensez a quelque chose de l'ordre de


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read ligne
    	do
    		idligne=`echo $ligne | cut -c 1-128`
        echo  $idligne  >> ${FIC_SQL}
    	done < $FIC_IN

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    Ton principal problème c'est que tu dois connaitre la locale utilisée pour la transcription de ta ligne.
    Exemple possible par exemple si tu es en fr_FR.utf8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_ALL=fr_FR.utf8 awk '{L=length($0);i=1;while(i<L){S=substr($0,i,128);print S;i=i+128}}' fichier
    mais tu peux déjà essayer avec ta configuration de local par défaut (car la commande fold ne tient pas compte de la locale, elle gère des octets et non des caractères (qui eux, peuvent être encodés sur plusieurs octets) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{L=length($0);i=1;while(i<L){S=substr($0,i,128);print S;i=i+128}}' fichier
    Bon après, le awk ici, ne fonctionne peut-être pas sur ton AIX....
    Si c'est le cas, peux-tu utiliser perl, par exemple, qui lui est à peu près similaire sur toutes les plateformes unix ?
    Cordialement.

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    la commande fold ne tient pas compte de la locale
    effectivement c'est bon à savoir

    par contre t'es sûr pour substr() que ça prend en compte les caractères étendus et pas les octets ?

    sinon Perl effectivement, un truc du style s/\X{128}/\1\n/ doit pouvoir faire le job

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bah, je me base sur le awk de Gnu, car j'en ai pas d'autre sous la main et encore moins celui de AIX:
    Gawk is multibyte aware. This means that index(), length(), substr() and match() all work in terms of characters, not bytes.
    Bon, après le man awk de AIX 7.2 dit:
    The awk command is affected by the LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATH, and PATH environment variables.
    Cordialement.

  10. #10
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut Quelle codage
    je vais tester même si j'ai un doute sur celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_ALL=fr_FR.utf8 awk '{L=length($0);i=1;while(i<L){S=substr($0,i,128);print S;i=i+128}}' fichier
    car sur linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    file -i fichier
    fichier text/plain; charset=us-ascii
    je cherche l'option par awk il y a 2 jours merci , le test sur linux est plus prometteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{L=length($0);i=1;while(i<L){S=substr($0,i,128);print S;i=i+128}}' fichier

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    On ne peut pas s'en sortir ici avec des utilitaires POSIX car ils sont destinés à traiter des chaines de caractères alors que le fichier contient manifestement du binaire, ou des caractères d'une locale inconnue.

    Voici une façon de procéder qui doit fonctionner sous AIX (ainsi que sur n'importe quel UNIX, et sur la plupart des Linux en remplaçant /bin/ksh par /bin/sh) car elle n'utilise que des commandes POSIX, et en particulier la commande "dd" qui est capable d'extraire un bloc de taille et d'offset spécifié :

    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
    #!/bin/ksh
    file=$1
    blockSize=128
    tmpFile=$(mktemp||exit)
    export LC_ALL=C
    PATH=$(getconf PATH):$PATH
     
    block=0
     
    (
      while true; do
        dd if=$file bs=$blockSize count=1 skip=$block 2>$tmpFile || break
        awk '/^0+/ {exit 1}' $tmpFile || break
        printf "\r"
        printf "." > /dev/tty
        block=$((block+1))
      done
    ) > ${1}.processed
    rm $tmpFile
    echo
    ɹǝsn *sıɹɐlos*

  12. #12
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 493
    Points : 152
    Points
    152
    Par défaut Desole pour la perte de temps mais merci
    En fait fold marche très bien mais le fichier de test ne correspondait pas à la règle ont il est question ici.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/08/2013, 18h17
  2. Syntaxe : noms de colonnes contenant des caractères spéciaux
    Par phDeveloppement dans le forum Langage SQL
    Réponses: 12
    Dernier message: 20/04/2012, 11h07
  3. Colonne de type caractère
    Par haykelFST dans le forum SQL
    Réponses: 10
    Dernier message: 03/04/2012, 14h10
  4. [MySQL] Nom de colonne comportant des caractéres speciaux inaccesible
    Par limace dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/04/2010, 20h21
  5. [CR 8] Export état dans Excel - colonne limitée à 255 caractères
    Par ARONE dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 20/07/2009, 10h50

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