A voir également:
- [Script Bash] découpage de lignes
- Script vidéo youtube - Guide
- Partage de photos en ligne - Guide
- Site de vente en ligne particulier - Guide
- Decoupage video - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
11 réponses
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
16 avril 2007 à 15:28
16 avril 2007 à 15:28
Une possibilité est de modifier la variable IFS qui considère chaque blanc comme un séparateur.
sinon pourquoi passer par une variable, par exemple remplacer chaque espace par virule espace avec sed:
sed 's/ /, /g' fichier
sinon pourquoi passer par une variable, par exemple remplacer chaque espace par virule espace avec sed:
sed 's/ /, /g' fichier
La technique avec sed n'est pas bonne car mes lignes se présente comme ca :
"ED5.13699 89988032 ..."
et les champs sont :
ED5.1
3699
89988032
Comme tu peux le voir, certains champs sont collés!
Si tu pouvais develloper sur IFS, ca ne me dit rien, je debute :)
"ED5.13699 89988032 ..."
et les champs sont :
ED5.1
3699
89988032
Comme tu peux le voir, certains champs sont collés!
Si tu pouvais develloper sur IFS, ca ne me dit rien, je debute :)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
16 avril 2007 à 15:45
16 avril 2007 à 15:45
Salut,
IFS= Input Field Separator (Séparateur de champs en entrée).
Par contre peux-tu nous coller un morceau plus grand de ton fichier, et être plus précis sur le découpage à faire (exemple plus détaillé ou sur 2 ou 3 lignes).
Merci.
;-))
IFS= Input Field Separator (Séparateur de champs en entrée).
Par contre peux-tu nous coller un morceau plus grand de ton fichier, et être plus précis sur le découpage à faire (exemple plus détaillé ou sur 2 ou 3 lignes).
Merci.
;-))
Je veux bien mais c'est lourd :).
C'est donc les 2 premieres lignes. La premiere d'ecrit le format des lignes suivantes.
Premiers champs s'appel TicketVersion, commence au caracteres 1, finit au 5, de type L(texte).
La ligne suivante est un exemple des 2000 lignes qui vont suivre.
Mon projet est d'inserer la valeur de chaque champs dans une base mysql, je souhaite donc decoupé chaques champs par des virgules, pour importer le fichier de sortie dans la base. Mon code marche mais est tres longs !!! 40min pour 2000 lignes. Ce qui n'est pas exploitable.
Comme je ne sais pas comment stocker la ligne avec tous les espaces, je "cat" le fichier + un tail et un head pour recuperer la ligne a chaque fois :o ce qui fait beaucoup de cat.
Exemple de fichier a traité :
#TicketVersion,1,5,L,CalledNumber,6,35,L,ChargedNumber,36,65,L,ChargedUserName,66,85,L,ChargedCostCenter,86,95,L,ChargedCompany,96,111,L,ChargedPartyNode,112,116,L,Subaddress,117,136,L,CallingNumber,137,166,L,CallType,167,168,R,CostType,169,169,N,EndDateTime,170,186,N,ChargeUnits,187,191,R,CostInfo,192,201,R,Duration,202,211,R,TrunkIdentity,212,216,R,TrunkGroupIdentity,217,221,R,TrunkNode,222,226,R,PersonalOrBusiness,227,227,N,AccessCode,228,243,L,SpecificChargeInfo,244,250,N,BearerCapability,251,251,N,HighLevelComp,252,253,R,DataVolume,254,263,R,UserToUserVolume,264,268,R,ExternFacilities,269,308,N,InternFacilities,309,348,N,CallReference,349,358,R,SegmentsRate1,359,368,R,SegmentsRate2,369,378,R,SegmentsRate3,379,388,R,ComType,389,389,N,X25IncomingFlowRate,390,391,R,X25OutgoingFlowRate,392,393,R,Carrier,394,395,R,InitialDialledNumber,396,425,L,WaitingDuration,426,430,R,EffectiveCallDuration,431,440,R,RedirectedCallIndicator,441,441,R,StartDateTime,442,458,N,ActingExtensionNumber,459,488,L,CalledNumberNode,489,493,R,CallingNumberNode,494,498,R,InitialDialledNumberNode,499,503,R,ActingExtensionNumberNode,504,508,R,TransitTrunkGroupIdentity,509,513,R,NodeTimeOffset,514,519,R
ED5.13699 89988032 Pro-ACD2 Dinamo 7710 0220061212 13:27:25 0 0 39 1 110 77102 00000002 1 0 010000000000000000000000000000000000000000000000000000000000000010000000000001000 0 0 0 01 0 0 03699 0 0020061212 13:26:4689988032 9999 9999 9999 771032767 0
C'est donc les 2 premieres lignes. La premiere d'ecrit le format des lignes suivantes.
Premiers champs s'appel TicketVersion, commence au caracteres 1, finit au 5, de type L(texte).
La ligne suivante est un exemple des 2000 lignes qui vont suivre.
Mon projet est d'inserer la valeur de chaque champs dans une base mysql, je souhaite donc decoupé chaques champs par des virgules, pour importer le fichier de sortie dans la base. Mon code marche mais est tres longs !!! 40min pour 2000 lignes. Ce qui n'est pas exploitable.
Comme je ne sais pas comment stocker la ligne avec tous les espaces, je "cat" le fichier + un tail et un head pour recuperer la ligne a chaque fois :o ce qui fait beaucoup de cat.
Exemple de fichier a traité :
#TicketVersion,1,5,L,CalledNumber,6,35,L,ChargedNumber,36,65,L,ChargedUserName,66,85,L,ChargedCostCenter,86,95,L,ChargedCompany,96,111,L,ChargedPartyNode,112,116,L,Subaddress,117,136,L,CallingNumber,137,166,L,CallType,167,168,R,CostType,169,169,N,EndDateTime,170,186,N,ChargeUnits,187,191,R,CostInfo,192,201,R,Duration,202,211,R,TrunkIdentity,212,216,R,TrunkGroupIdentity,217,221,R,TrunkNode,222,226,R,PersonalOrBusiness,227,227,N,AccessCode,228,243,L,SpecificChargeInfo,244,250,N,BearerCapability,251,251,N,HighLevelComp,252,253,R,DataVolume,254,263,R,UserToUserVolume,264,268,R,ExternFacilities,269,308,N,InternFacilities,309,348,N,CallReference,349,358,R,SegmentsRate1,359,368,R,SegmentsRate2,369,378,R,SegmentsRate3,379,388,R,ComType,389,389,N,X25IncomingFlowRate,390,391,R,X25OutgoingFlowRate,392,393,R,Carrier,394,395,R,InitialDialledNumber,396,425,L,WaitingDuration,426,430,R,EffectiveCallDuration,431,440,R,RedirectedCallIndicator,441,441,R,StartDateTime,442,458,N,ActingExtensionNumber,459,488,L,CalledNumberNode,489,493,R,CallingNumberNode,494,498,R,InitialDialledNumberNode,499,503,R,ActingExtensionNumberNode,504,508,R,TransitTrunkGroupIdentity,509,513,R,NodeTimeOffset,514,519,R
ED5.13699 89988032 Pro-ACD2 Dinamo 7710 0220061212 13:27:25 0 0 39 1 110 77102 00000002 1 0 010000000000000000000000000000000000000000000000000000000000000010000000000001000 0 0 0 01 0 0 03699 0 0020061212 13:26:4689988032 9999 9999 9999 771032767 0
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Hum je m'en doutais j'ai un peu demonté la page mais bon ca ma permis de me rendre compte que les espaces disaparaisse aussi en html :p je les remplaces par des étoiles histoire que vous voyez ce que ca donne :
ED5.13699**************************89988032***********************Pro-ACD2*Dinamo********************************7710***************************************************022006121213:27:25****0*********0********39****1**110*77102****************00000002*1*********0****010000000000000000000000000000000000000000000000000000000000000010000000000001000*********0*********0*********0*********01*0*0*03699******************************0*********0020061212*13:26:4689988032***********************9999*9999*9999*771032767*****0
ED5.13699**************************89988032***********************Pro-ACD2*Dinamo********************************7710***************************************************022006121213:27:25****0*********0********39****1**110*77102****************00000002*1*********0****010000000000000000000000000000000000000000000000000000000000000010000000000001000*********0*********0*********0*********01*0*0*03699******************************0*********0020061212*13:26:4689988032***********************9999*9999*9999*771032767*****0
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
16 avril 2007 à 18:18
16 avril 2007 à 18:18
Re-
J'ai du mal à saisir ce que tu veux vraiment entre ce que tu dis dans ton post #0 (inserer un caractère, dans mon cas la virgule, avant chaque champ) et ton post #2 (Comme tu peux le voir, certains champs sont collés! "ED5.13699").
Essaie ça avec sed :
J'ai du mal à saisir ce que tu veux vraiment entre ce que tu dis dans ton post #0 (inserer un caractère, dans mon cas la virgule, avant chaque champ) et ton post #2 (Comme tu peux le voir, certains champs sont collés! "ED5.13699").
Essaie ça avec sed :
sed 's/[ ][ ]*/,/g'Ça marche sur tous les espaces (1 ou +).
Je vais testé mais je pense pas que le résultat sera celui dont j'ai besoin, je reexplique pour l'histoire de champs collé avec un petit exemple du résultat souhaité :
ligne brut (du moins le debut, soit les 3 premiers champs) :
ED5.13699**************************89988032
ligne traité (n'oublions pas que les etoiles sont en faites des espaces :
,ED5.1,3699**************************,89988032
Comme tu peux le remarquer il n'y a pas d'espace entre les 2 premiers champs, c'est pourquoi je n'utilise pas l'espace comme séparateur. Je me sert des index donnés par la premiere ligne :
#TicketVersion,1,5,L,CalledNumber,6,35,L,ChargedNumber,36,65
je te donne ma ligne de code qui me permet de découpé ma chaine actuellement :
cat $fichier | tail -n $nombredetickets | head --bytes=$indexvalue | tail --bytes=$temporaire
$fichier est le fichier texte d'origine
$nombredetickets est le nombre de ligne - 1 (- la premiere #....) (la variable est decrementer a chaque boucle pour traité la ligne suivante)
$indexvalue c'est le nombre de caractères pour arrivé jusqu'a la fin de la valeur a recupéré
$temporaire c'est les n derniers bytes a prendre pour récupéré la valeurs
un peu compliqué je traduit, pour recuperer le 2eme champs on a la ligne :
ED5.13699**************************89988032...
on prend les 35 premiers caratères :
ED5.13699**************************
puis les 35-(6-1):
3699**************************
Youpi ! on a recuperer notre champs, ensuite je concatene avec une virgule et je rajoute ca dans un fichier de sortie.
Le probleme que j'ai c'est que je fait un cat sur un fichier de 2300 ligne, un peu plus de 2300 fois, ce qui rend horriblement longs le script :|
Je me doute que ca irait plus vite en python ou peut etre awk, mais je ne connais pas du tout c'est language :/
Merci de consacrer du temps pour mon problème. Si il y a toujours des points noirs dans mes expliquations n'hésite pas :)
ligne brut (du moins le debut, soit les 3 premiers champs) :
ED5.13699**************************89988032
ligne traité (n'oublions pas que les etoiles sont en faites des espaces :
,ED5.1,3699**************************,89988032
Comme tu peux le remarquer il n'y a pas d'espace entre les 2 premiers champs, c'est pourquoi je n'utilise pas l'espace comme séparateur. Je me sert des index donnés par la premiere ligne :
#TicketVersion,1,5,L,CalledNumber,6,35,L,ChargedNumber,36,65
je te donne ma ligne de code qui me permet de découpé ma chaine actuellement :
cat $fichier | tail -n $nombredetickets | head --bytes=$indexvalue | tail --bytes=$temporaire
$fichier est le fichier texte d'origine
$nombredetickets est le nombre de ligne - 1 (- la premiere #....) (la variable est decrementer a chaque boucle pour traité la ligne suivante)
$indexvalue c'est le nombre de caractères pour arrivé jusqu'a la fin de la valeur a recupéré
$temporaire c'est les n derniers bytes a prendre pour récupéré la valeurs
un peu compliqué je traduit, pour recuperer le 2eme champs on a la ligne :
ED5.13699**************************89988032...
on prend les 35 premiers caratères :
ED5.13699**************************
puis les 35-(6-1):
3699**************************
Youpi ! on a recuperer notre champs, ensuite je concatene avec une virgule et je rajoute ca dans un fichier de sortie.
Le probleme que j'ai c'est que je fait un cat sur un fichier de 2300 ligne, un peu plus de 2300 fois, ce qui rend horriblement longs le script :|
Je me doute que ca irait plus vite en python ou peut etre awk, mais je ne connais pas du tout c'est language :/
Merci de consacrer du temps pour mon problème. Si il y a toujours des points noirs dans mes expliquations n'hésite pas :)
neo a dit : trinity aide moi !
benj crie : jipicy aide moi !
Je bloque la :|
Si t'as un peu de temps a consacrer a mon gros problème :)
benj crie : jipicy aide moi !
Je bloque la :|
Si t'as un peu de temps a consacrer a mon gros problème :)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 avril 2007 à 14:49
17 avril 2007 à 14:49
Si t'as un peu de temps a consacrer a mon gros problème :)
Ben j'y bosse depuis ce matin (sans compter hier soir ;-) ), et je cale aussi.
Patience ;-))
Ben j'y bosse depuis ce matin (sans compter hier soir ;-) ), et je cale aussi.
Patience ;-))
Benj
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
17 avril 2007 à 14:58
17 avril 2007 à 14:58
héhé
Merci, courage :p
Merci, courage :p
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 avril 2007 à 19:35
17 avril 2007 à 19:35
Bon j'avance un peu, mais je cale toujours sur un ch"tit détail qui me fout tout en l'air !!!
En gros :
- j'isole la 1ère ligne
- dans une boucle j'extrais les valeurs (1 et 6) dans 2 variables
- je passe ces deux variables à "awk" via "substr" (merci "phil" au passage) pour imprimer (en sortie dans un fichier) normalement la chaîne résultant de cet intervalle suivie d'une virgule. (mais c'est là que ça merdoie !!!??? et je sais pas pourquoi !!??)
- puis je boucle pour les autres champs (6,35) etc... (et ça continue de merdoyer là aussi ;-(( )
- quand la ligne est finie, on lit la suivante...
Voilà le script qui foire ;-(
En gros :
- j'isole la 1ère ligne
- dans une boucle j'extrais les valeurs (1 et 6) dans 2 variables
- je passe ces deux variables à "awk" via "substr" (merci "phil" au passage) pour imprimer (en sortie dans un fichier) normalement la chaîne résultant de cet intervalle suivie d'une virgule. (mais c'est là que ça merdoie !!!??? et je sais pas pourquoi !!??)
- puis je boucle pour les autres champs (6,35) etc... (et ça continue de merdoyer là aussi ;-(( )
- quand la ligne est finie, on lit la suivante...
Voilà le script qui foire ;-(
#! /bin/bash # Variables #+ fichier fich="benj.txt" #+ 1ère ligne référence L1=$(sed '1!d' benj.txt) #+ compteur incrémentiel nombre de champs i=0 #+ référence de départ valeur1 et valeur2 (caractère) val1="2" val2="3" #+ nombre de champs nbr_champ=$(sed -n '1p' $fich |awk -F, '{print NF}') # tant qu'on lit une ligne while read line # faire do # tant que le compteur de champs est inférieur au nombre de champs while [ "$i" -lt "$nbr_champ" ] # faire do # initialisation des variables à la valeur correspondante au champ #+ égal à $valx C1=$(echo "$L1" | awk -F, ' { print $'"$val1"' }') C2=$(echo "$L1" | awk -F, ' { print $'"$val2"' }') echo "$line" | awk '{ print substr($0,'"$C1"','"$C2"')"," }' | tee -a tmp.txt val1=$(expr $val1 + 4) val2=$(expr $val2 + 4) i=$(expr $i + 4) done done < <(sed '1d' $fich)Si vous avez des idées... merci ;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 avril 2007 à 21:31
17 avril 2007 à 21:31
Voilà un truc qui semble marcher. A tester donc :
#! /bin/bash # Variables #+ fichier fich="benj.txt" #+ 1ère ligne référence L1=$(sed '1!d' benj.txt) #+ compteur incrémentiel nombre de champs i=0 #+ référence de départ valeur1 et valeur2 (caractère) val1="2" val2="3" #+ nombre de champs nbr_champ=$(sed -n '1p' $fich |awk -F, '{print NF}') # tant qu'on lit une ligne while read line # faire do # tant que le compteur de champs est inférieur au nombre de champs while [ "$i" -lt "$nbr_champ" ] # faire do # initialisation des variables à la valeur correspondante au champ #+ égal à $valx C1=$(echo "$L1" | awk -F, ' { print $'"$val1"' }') if [ "$C1" == 1 ] then C1="0" fi C2=$(echo "$L1" | awk -F, ' { print $'"$val2"' }') #+ extraction de la longueur de la chaîne C2=$(($C2-$C1)) # extraction de la chaîne correspondant à l'intervalle echo "$line" | awk '{ print substr($0,'"$C1"','"$C2"')"," }' >> tmp.txt # incrémentation des variables (+4 champs) val1=$(expr $val1 + 4) val2=$(expr $val2 + 4) i=$(expr $i + 4) done i=0 val1="2" val2="3" # on supprime la virgule de la dernière ligne sed -i '$ s/,$//' tmp.txt done < <(sed '1d' $fich) # on supprime le saut de ligne final de chaque ligne se terminant par une virgule #+ (on colle chaque ligne) sed -e ':a' -e '/,$/N; s/\n//; ta' tmp.txt > fichier.txt;-))
J'imagine que tu vas me tuer !
Test sur un fichier de 2313 lignes 23min :)
avec mon programme 27min !
Bon c'est déjà un mieux mais au total par jour il faut compté un traitement 5x plus long pour 260 machines :o irréalisable.
Je suis choqué qu'un traitement simple d'un fichier texte de quelques Ko soit aussi longs que l'encodage d'une vidéo :)
Faudrait faire ca avec un language compilé peut etre.
Ou comme l'étape suivante est d'inséré chaque champ dans une BD, le faire directement.
Je bloque là
any idea ?
ps : ca fera combien d'aspirine pour ce casse tete ?
Test sur un fichier de 2313 lignes 23min :)
avec mon programme 27min !
Bon c'est déjà un mieux mais au total par jour il faut compté un traitement 5x plus long pour 260 machines :o irréalisable.
Je suis choqué qu'un traitement simple d'un fichier texte de quelques Ko soit aussi longs que l'encodage d'une vidéo :)
Faudrait faire ca avec un language compilé peut etre.
Ou comme l'étape suivante est d'inséré chaque champ dans une BD, le faire directement.
Je bloque là
any idea ?
ps : ca fera combien d'aspirine pour ce casse tete ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
18 avril 2007 à 14:52
18 avril 2007 à 14:52
Non, pas de meurtre en perspective, du moins pas z'encore ;-))
Ben oui faudrait voir avec Perl, mais le spécialiste maison, j'ai nommé "lami20j", est absent pour un mois... Donc faudra patienter.
Sinon voir aussi du côté du "C", mais là encore c'est pas mon domaine.
Si "mamiemando" passe dans le coin... ;-))
Ben oui faudrait voir avec Perl, mais le spécialiste maison, j'ai nommé "lami20j", est absent pour un mois... Donc faudra patienter.
Sinon voir aussi du côté du "C", mais là encore c'est pas mon domaine.
Si "mamiemando" passe dans le coin... ;-))
Benj
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
18 avril 2007 à 15:17
18 avril 2007 à 15:17
erf faudrait que ca marche avant la fin de la semaine prochaine :D
Bon ben me reste a apprendre un nouveau language ^^
Merci quand meme de t'avoir penché sur le problème :)
Bon ben me reste a apprendre un nouveau language ^^
Merci quand meme de t'avoir penché sur le problème :)