Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[Shell] Découpage fichier
Envoyé par: footix06

Bonjour,
j'ai fichier .csv d'environ 200 000 lignes.
Il est déjà trié mais il faut le découper en plusieurs fichiers.

voici la forme qu'il a en gros:
"0000";"xxxx";"yyy"
"0000";"xxxx";"yyy"
"1111";"xxxx";"yyy"
"1111";"xxxx";"yyy"
"1111";"xxxx";"yyy"
"5555";"xxxx";"yyy"
"5555";"xxxx";"yyy"
...

de ce fichier, j'ai besoin d'avoir un fichier par categorie de la premiere colonne, soit:
fichier 0000.csv qui contient
"0000";"xxxx";"yyy"
"0000";"xxxx";"yyy"
fichier 1111.csv qui contient
"1111";"xxxx";"yyy"
"1111";"xxxx";"yyy"
"1111";"xxxx";"yyy"

avez vous idée sur la manière dont je dois traiter le problème.
merci

Poste le Monday 2 November 2009 12:03:35
Répondre     Citer    
Re: [Shell] Découpage fichier
Envoyé par: footix06

Donc je commence comme ça:

FICHIER=fichier_in.csv

for i in `cat $FICHIER`
do
RECUP=`echo $i |awk -F ";" '{printf ("%s\n",$1)}'|sed s/\"//g`
echo $RECUP
sleep 10
#echo $i >>$RECUP.csv
done

le problème est que si j'ai une ligne avec un blanc ("0000";"xxxx";"yy y";"zzz" )
j'ai le résultat suivant:
"0000";"xxxx";"yy
y";"zzz"

Poste le Tuesday 3 November 2009 14:03:47
Répondre     Citer    
Re: [Shell] Découpage fichier
Envoyé par: footix06

Alors j'ai opté pour le while mais je trouve que c'est trop long (187 000 lignes en 14 minutes)
Avez vous une solution pour que ce soit plus rapide ?

voici mon script:
while read ligne
do
        CODE_A_RECUP=`echo $ligne |awk -F ";" '{printf ("%s\n",$1)}'|sed s/\"//g`
        echo $ligne >>$CODE_A_RECUP.csv
done <MonFichier.in

Poste le Wednesday 4 November 2009 12:03:04
Répondre     Citer    
Re: [Shell] Découpage fichier
Envoyé par: footix06

je me répond tout seul :+)

je change, je ne passe plus par le while qui prend 14 minutes, je passe par un awk et un grep.
maintenant, cela me prend ...... 7 secondes.

donc voici le script:

#! /bin/sh
FICHIER=MonFichier.in

date # juste pour savoir combien de temps ça dure

PARAM1=`awk -F";" '{print $1}' $FICHIER |sed s/\"//g |uniq` # recupere 1 seule fois le champ qui m'interesse

for i in $PARAM1                            # pour chaque "mot"
do
   TITRE="===== champ $PARAM1 ====="
   echo $TITRE >fictmp2/$i.csv              # juste pour info en premiere ligne du fichier
   grep \^\"$i\" $FICHIER >>fictmp2/$i.csv  # recherche toutes les lignes qui commencent par $i
done
date # juste pour savoir combien de temps ça dure

il ne me reste plus qu'a faire un test pour que \^\"$i\" soit bien numerique.

Poste le Thursday 5 November 2009 16:29:19
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[Shell] Découpage fichier
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons