1. #1
    Membre régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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
    2 272
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 272
    Points : 6 076
    Points
    6 076

    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
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

  3. #3
    Membre régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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
    2 272
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 272
    Points : 6 076
    Points
    6 076

    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) ?
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

  5. #5
    Membre régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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 régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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 Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 426
    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 : 2 426
    Points : 6 746
    Points
    6 746

    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
    2 272
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 272
    Points : 6 076
    Points
    6 076

    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
    Avant donc que d'écrire, apprenez à penser.
    Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
                                                        - Nicolas Boileau, L'Art poétique

  9. #9
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 426
    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 : 2 426
    Points : 6 746
    Points
    6 746

    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 régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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 443
    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 443
    Points : 6 649
    Points
    6 649

    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 régulier Avatar de dedalios
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : février 2008
    Messages : 240
    Points : 91
    Points
    91

    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, 19h17
  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, 12h07
  3. Colonne de type caractère
    Par haykelFST dans le forum SQL
    Réponses: 10
    Dernier message: 03/04/2012, 15h10
  4. Réponses: 5
    Dernier message: 07/04/2010, 21h21
  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, 11h50

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