script pour calculer largeur de colonne

Le
pmxk
Bonjour,

quel serait le moyen le plus rapide pour déterminer la taille maximum des
colonnes d'un fichier csv ?
exemple :

si le csv contient ça :
col1;col2;col3
abcd;123456;xyz
def;;ddddddddd

le script devrait me donner :
col1 = 4
col2 = 6
col3 = 9

sachant que ces fichiers sont souvent très gros (20 colonnes sur 10000
lignes), il faut un système rapide.
J'ai fait un script "bourin" qui boucle et scan toutes les lignes et toutes
les colonnes, mais pas performant du tout.

Le but est de créer ensuite la structure d'une table dans une base sql afin
d'y importer les données du csv.
Merci pour vos idées.
pmxk
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Kevin Denis
Le #1904563
Le 12-10-2007, pmxk

quel serait le moyen le plus rapide pour déterminer la taille maximum des
colonnes d'un fichier csv ?
exemple :

Peut etre quelque chose du genre:

IFS="
"
for ligne in ` cat fichier.csv` ; do echo $ligne | wc -c ; done | sort

--
Kevin

pmxk
Le #1904561
"Kevin Denis" news:

quel serait le moyen le plus rapide pour déterminer la taille maximum
des


colonnes d'un fichier csv ?
exemple :

Peut etre quelque chose du genre:

IFS="
"
for ligne in ` cat fichier.csv` ; do echo $ligne | wc -c ; done | sort

--
Kevin


Merci, mais cela ne me donne que la taille totale de la ligne, mais pas des
colonnes.
La structure de parcours serait plutôt comme ça :
cat fichier.csv |
while read line
do
IFS=";"
for col in $line
mettre les max dans un tableau
done
done

ça marche, mais c'est trop lent sur des gros fichiers.

A+


Cumbalero
Le #1904559

ça marche, mais c'est trop lent sur des gros fichiers.



Tu n'as de toutes façons pas le choix au niveau de l'algo: il faut
parser toutes le lignes du fichier, donc quelle que soit
l'implémentation (en awk on doit permettre de faire ça plus efficacem ent
par exemple), ce sera long et consommateur.

Il me paraitrait bien plus judicieux de faire cela au moment de la
génération du fichier csv!

A+
JF

Thierry B.
Le #1904551
--{ pmxk a plopé ceci: }--

cat fichier.csv |
while read line
do
IFS=";"
for col in $line
mettre les max dans un tableau
done
done

Il faut être très méfiant avec les CSV. Un jour ou l'autre, tu

vas te retrouver avec un séparateur de champ à l'intérieur d'un
champ, et là, *paf* le chien.

"Oui, mais non",42,"Il vaut mieux utiliser un vrai parseur"



--
L'attaque d'Usenet par UTF-8 (film à 22h30)

Matthieu Clavier
Le #1904540
On 2007-10-12, pmxk
quel serait le moyen le plus rapide pour déterminer la taille maximum des
colonnes d'un fichier csv ?


un (quick&dirty) bout de Perl ?

perl -F';' -ane '$i=0;foreach (@F) { length $F[$i] > $T[$i] and
$T[$i] = length $F[$i]; $i++ } END { $i=0; foreach (@T) { print
"col",++$i," = $_n" } }' t.csv
col1 = 4
col2 = 6
col3 = 10

suivi positionné sur fclp

--
Matthieu Clavier

Cem
Le #1904470
Le 12-10-2007, Matthieu Clavier
On 2007-10-12, pmxk
quel serait le moyen le plus rapide pour déterminer la taille maximum des
colonnes d'un fichier csv ?


un (quick&dirty) bout de Perl ?

perl -F';' -ane '$i=0;foreach (@F) { length $F[$i] > $T[$i] and
$T[$i] = length $F[$i]; $i++ } END { $i=0; foreach (@T) { print
"col",++$i," = $_n" } }' t.csv
col1 = 4
col2 = 6
col3 = 10



Ou en awk un truc de ce genre:

awk 'BEGIN { FS=";"; OFS=";"; lg[1]=0 };
{ for (i=1;i<=NF;i++) { if (i>length(lg)) lg[i]=0;
if (length($i)>lg[i]) lg[i]=length($i) } };
END { for (i=1;i<=length(lg);i++) $i=lg[i]; print }' t.csv

Sur un très gros fichier, je me demande si c'est gawk ou perl
qui va le plus vite...


Cumbalero
Le #1904465

Sur un très gros fichier, je me demande si c'est gawk ou perl
qui va le plus vite...


D'où ma remarque sur le fait qu'il était plus judicieux de génére r ces
stats sur la machine qui crée le csv, il n'y a donc pas besoin de parse r
un fichier pour en extraire des stats.

Mais bon, ne pas connaitre la valeur maxi des champs qu'on manipule,
toute considération technique mise à part, ça me parait abérant.

A+
JF

Thierry B.
Le #1904461
--{ Cem a plopé ceci: }--


Sur un très gros fichier, je me demande si c'est gawk ou perl
qui va le plus vite...


Ou celui qui plantera le plus vite. Le format CSV est fourbe.

--
http://www.columbia.edu/acis/history/029.html

Thierry B.
Le #1904460
--{ Cumbalero a plopé ceci: }--

Mais bon, ne pas connaitre la valeur maxi des champs qu'on manipule,
toute considération technique mise à part, ça me parait abérant.

Bienvenue dans le monde réel :)



--
/%/%/%/%/%/%/%/%/%/%/%/%/%/% http://fortran.morefun.over-blog.com/

CoolFox31
Le #1904420
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Thierry B. wrote:
--{ Cem a plopé ceci: }--

Sur un très gros fichier, je me demande si c'est gawk ou perl
qui va le plus vite...


Ou celui qui plantera le plus vite. Le format CSV est fourbe.

Je dirais même plus: c'est un format fourbe-tout !


ok je ------------> [ ]

- --
Cle GnuPG disponible sur http://pgp.mit.edu (0x7D9DBDE7)

Un jour, Dieu a dit :
"il faut partager : les riches auront de la nourriture, les pauvres de
l'appétit!"

Coluche
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFHFk2AspCmGn2dvecRCpNIAJ9dI8clbAaGmT6ucD/4/TXNRtQNtQCfd0GZ
024lI0tVaxKC7TwvsnaQY0g =suv1
-----END PGP SIGNATURE-----


Publicité
Poster une réponse
Anonyme