Hello,

On Tue, Dec 02, 2003 at 01:19:05AM -0800, [EMAIL PROTECTED] wrote:
> J'ai un vieux fichier Excel que je voudrais bien convertir. Au fait, j'ai
> des champs dans ce fichier qui ne sont plus valides. Ce fichier n'est pas
> un .xls mais un truc "plat" dont les champs sont separes par des ";"
> (point-virgule)
> 
> J'ai un autre fichiers "plat" contenant la liste des mots qui doivent etre
> changes leurs correspondants. Par exemple:
> 
> Alain user1234
> Pierre user4577
> Simon user98562
> 
> Je voudrais lancer le script pour que le fichier "csv" soit passe au
> crible par le fichier "dico" et me sortir un fichier "csv.NEW"
> 
> La longueur des champs du fichier "csv" est aleatoire. Les mots du dico
> doivent absolument respecter la "case" car je pourrais avoir Jean-Pierre
> (ne doit pas se telescoper avec "Pierre")
> 
> Quelqu'un pour m'aider? Est-ce possible de faire cela simplement?

Perl est ton ami. ;)

Soit les fichiers originaux:
[EMAIL PROTECTED] bogo]$ cat f1.csv
Eric;26;19761213;1640;Rhode-St-Genese
Nicolas;18;19841213;4670;Blegny
Alexandra;22;19820310;1200;Woluwe-St-Lambert
[EMAIL PROTECTED] bogo]$ cat dico.txt
Eric eda
Nicolas nick
[EMAIL PROTECTED] bogo]$

Soit le script Perl:
[EMAIL PROTECTED] bogo]$ cat csv.pl
#!/usr/bin/perl

open (CSV, '<f1.csv') or die "Cannot open CSV file";
open (DICO, '<dico.txt') or die "Cannot open dico file";
open (OUT, '>f1_new.csv') or die "Cannot open output file";

# Chargement de dico dans un hash
while ($line=<DICO>) {
        ($word,$def) = split(' ', $line);
        $dico{$word}=$def;
}

close DICO;

# On lit chaque ligne,
while ($line=<CSV>) {
        # On decoupe en champs avec ; comme separateur
        @cols=split(';', $line);
        # Si la colonne 0 contient le nom a remplacer
        if ($dico{$cols[0]}) {
                $cols[0]=$dico{$cols[0]};
        }
        print OUT join(';', @cols);
}

close OUT;
close CSV;

[EMAIL PROTECTED] bogo]$


Le resultat:
[EMAIL PROTECTED] bogo]$ ./csv.pl
[EMAIL PROTECTED] bogo]$ cat f1_new.csv
eda;26;19761213;1640;Rhode-St-Genese
nick;18;19841213;4670;Blegny
Alexandra;22;19820310;1200;Woluwe-St-Lambert
[EMAIL PROTECTED] bogo]$


Attention cependant !
Mon code est du genre bourrin. C'est bon pour ce que tu veux faire et puis jeter.
Dans le cas ou la colonne a modifier est la derniere, il faudra faire attention 
qu'elle contient un retour chariot. Un chomp() sur la ligne avant et un "\n" dans le 
print feront l'affaire.

Maintenant, si tu veux remplacer dans toutes le colonnes en vrac, tu peux juste faire 
un
foreach $key (keys %dico) {
        $line =~ s/$key/$dico{$key}/;
}

Bon amusement.

Eric.

_______________________________________________________
Linux Mailing List - http://www.unixtech.be
Subscribe/Unsubscribe: http://www.unixtech.be/mailman/listinfo/linux
Archives: http://www.mail-archive.com/[EMAIL PROTECTED]
IRC: efnet.unixtech.be:6667 - #unixtech

Répondre à