Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script pour calculer largeur de colonne

11 réponses
Avatar
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

10 réponses

1 2
Avatar
Kevin Denis
Le 12-10-2007, pmxk a écrit :

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

Avatar
pmxk
"Kevin Denis" a écrit dans le message de
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+


Avatar
Cumbalero

ç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

Avatar
Thierry B.
--{ 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)

Avatar
Matthieu Clavier
On 2007-10-12, pmxk wrote:
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

Avatar
Cem
Le 12-10-2007, Matthieu Clavier a écrit :
On 2007-10-12, pmxk wrote:
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...


Avatar
Cumbalero

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

Avatar
Thierry B.
--{ 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

Avatar
Thierry B.
--{ 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/

Avatar
CoolFox31
-----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-----


1 2