J'ai un fichier de 50 Mo, je souhaiterais le d=E9couper =E0 chaque fois
qu'il y a la balise <HTML> en un "fichier fille"
Voila se que j'ai fais et marche pas :
#!/usr/local/bin/perl -wn
BEGIN {
$file =3D "$0";
$/ =3D \<HTML>;
$n =3D 1;
}
unless( $n++ % \<HTML> ) { close F;
open F, "> $file.csv"
or die "Impossible de cr=E9er $file.csv: $!";
$file++;
}
print F;
L'erreur : $ perl -w cut-perl partie00
readline() on unopened filehandle HTML at cut-perl line 4.
Use of uninitialized value in <HANDLE> at cut-perl line 1.
readline() on unopened filehandle HTML at cut-perl line 7.
print() on unopened filehandle F at cut-perl line 12.
Use of uninitialized value in <HANDLE> at cut-perl line 12, <> chunk 1.
Ah ben vi... Moi je le lancais par "perl script.pl". Ralala
damien guerin
Rolala... J'ai pas l'impression que tu cherches réellement : ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]"); open (OUT, ">out.tmp"); $cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print OUT $line; } close OUT;
Rolala... J'ai pas l'impression que tu cherches réellement :
ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]");
open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ /<HTML/) {
$cpt++;
close OUT;
rename "out.tmp", $cpt.".hml";
open (OUT, ">out.tmp");
}
print OUT $line;
}
close OUT;
Rolala... J'ai pas l'impression que tu cherches réellement : ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]"); open (OUT, ">out.tmp"); $cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print OUT $line; } close OUT;
ptilou
Bonjour,
damien guerin wrote:
Rolala... J'ai pas l'impression que tu cherches réellement :
AH oui, perl pour les newbie, c'est de la torture !
ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]"); open (OUT, ">out.tmp"); $cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print OUT $line; } close OUT;
Je comprend pas à la ligne 5, y a if, et puis pas else plus loin ? Je ne vois pas on ne comprend pas ou il découpe le fichier ? Faut déplacer rename ? J'ai trouvé l'arg -a pour autosplit mais les balise c'est < et </ ce qu'il considére comme une commande, comment éviter ça ?
Merçi
Ptilou
Bonjour,
damien guerin wrote:
Rolala... J'ai pas l'impression que tu cherches réellement :
AH oui, perl pour les newbie, c'est de la torture !
ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]");
open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ /<HTML/) {
$cpt++;
close OUT;
rename "out.tmp", $cpt.".hml";
open (OUT, ">out.tmp");
}
print OUT $line;
}
close OUT;
Je comprend pas à la ligne 5, y a if, et puis pas else plus loin ?
Je ne vois pas on ne comprend pas ou il découpe le fichier ? Faut
déplacer rename ?
J'ai trouvé l'arg -a pour autosplit mais les balise c'est < et </ ce
qu'il considére comme une commande, comment éviter ça ?
Rolala... J'ai pas l'impression que tu cherches réellement :
AH oui, perl pour les newbie, c'est de la torture !
ton print doit écrire dans le fichier, voir code suivant :
Syntaxe : perl script.pl <fichier>
open (IN, "< $_[$[]"); open (OUT, ">out.tmp"); $cpt=0; while ($line = <IN>) { if ($line =~ /<HTML/) { $cpt++; close OUT; rename "out.tmp", $cpt.".hml"; open (OUT, ">out.tmp"); } print OUT $line; } close OUT;
Je comprend pas à la ligne 5, y a if, et puis pas else plus loin ? Je ne vois pas on ne comprend pas ou il découpe le fichier ? Faut déplacer rename ? J'ai trouvé l'arg -a pour autosplit mais les balise c'est < et </ ce qu'il considére comme une commande, comment éviter ça ?
Merçi
Ptilou
Stephane Zuckerman
J'ai un fichier de 50 Mo, je souhaiterais le découper à chaque fois qu'il y a la balise <HTML> en un "fichier fille"
Je m'en tiens à ton cahier des charges, et pas à ton code.
#!/usr/bin/perl use strict; use warnings;
usage($0) unless (@ARGV);
foreach my $file (@ARGV) { open(my $fh, "<", $file) || die "Erreur lors de l'ouverture de $file : $!"; my $content = undef; { local $/; $content = <$fh>; } # slurp ! if ($content =~ m{<HTML>.*</HTML>}is) { open(my $out, ">", "$file.out") || die "Erreur lors de l'ouverture de $file.out : $!"; print $out $1; close($out) || print STDERR "erreur lors de la fermeture de $file.outn"; } close($fh) || print STDERR "Erreur lors de la fermeture de $file : $!n"; }
sub usage { my $progname = shift; print STDERR "USAGE : $progname { fichiers à examiner }n"; exit(1); } -- "Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce que je veux !" "The obvious mathematical breakthrough would be development of an easy way to factor large prime numbers." (Bill Gates, The Road Ahead)
J'ai un fichier de 50 Mo, je souhaiterais le découper à chaque fois
qu'il y a la balise <HTML> en un "fichier fille"
Je m'en tiens à ton cahier des charges, et pas à ton code.
#!/usr/bin/perl
use strict;
use warnings;
usage($0) unless (@ARGV);
foreach my $file (@ARGV) {
open(my $fh, "<", $file) || die "Erreur lors de l'ouverture de $file :
$!";
my $content = undef;
{ local $/; $content = <$fh>; } # slurp !
if ($content =~ m{<HTML>.*</HTML>}is) {
open(my $out, ">", "$file.out") ||
die "Erreur lors de l'ouverture de $file.out :
$!";
print $out $1;
close($out) ||
print STDERR "erreur lors de la fermeture de
$file.outn";
}
close($fh) || print STDERR "Erreur lors de la fermeture de $file :
$!n";
}
sub usage {
my $progname = shift;
print STDERR "USAGE : $progname { fichiers à examiner }n";
exit(1);
}
--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)
J'ai un fichier de 50 Mo, je souhaiterais le découper à chaque fois qu'il y a la balise <HTML> en un "fichier fille"
Je m'en tiens à ton cahier des charges, et pas à ton code.
#!/usr/bin/perl use strict; use warnings;
usage($0) unless (@ARGV);
foreach my $file (@ARGV) { open(my $fh, "<", $file) || die "Erreur lors de l'ouverture de $file : $!"; my $content = undef; { local $/; $content = <$fh>; } # slurp ! if ($content =~ m{<HTML>.*</HTML>}is) { open(my $out, ">", "$file.out") || die "Erreur lors de l'ouverture de $file.out : $!"; print $out $1; close($out) || print STDERR "erreur lors de la fermeture de $file.outn"; } close($fh) || print STDERR "Erreur lors de la fermeture de $file : $!n"; }
sub usage { my $progname = shift; print STDERR "USAGE : $progname { fichiers à examiner }n"; exit(1); } -- "Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce que je veux !" "The obvious mathematical breakthrough would be development of an easy way to factor large prime numbers." (Bill Gates, The Road Ahead)
damien guerin
Pourquoi veux tu de "else" et pourquoi veux tu absolument qu'il y ait un split??? Ce qui ce passe : Ouverture du fichier à traiter et lecture ligne par ligne. Tant que la ligne ne contient pas <HTML>, écriture dans le fichier out.tmp Si la ligne contient <HTML>, fermeture de OUT, rennommage de OUT par <compteur>.html, puis réouverture de OUT. Tu as ton tes fichiers filles de créés !
Y a surement plus performant comme algorithme mais parfois vaut mieux choisir quelque chose de simple et clair plutot que choisir quelque chose d'ilisible !
Pourquoi veux tu de "else" et pourquoi veux tu absolument qu'il y ait
un split???
Ce qui ce passe :
Ouverture du fichier à traiter et lecture ligne par ligne.
Tant que la ligne ne contient pas <HTML>, écriture dans le fichier
out.tmp
Si la ligne contient <HTML>, fermeture de OUT, rennommage de OUT par
<compteur>.html, puis réouverture de OUT.
Tu as ton tes fichiers filles de créés !
Y a surement plus performant comme algorithme mais parfois vaut mieux
choisir quelque chose de simple et clair plutot que choisir quelque
chose d'ilisible !
Pourquoi veux tu de "else" et pourquoi veux tu absolument qu'il y ait un split??? Ce qui ce passe : Ouverture du fichier à traiter et lecture ligne par ligne. Tant que la ligne ne contient pas <HTML>, écriture dans le fichier out.tmp Si la ligne contient <HTML>, fermeture de OUT, rennommage de OUT par <compteur>.html, puis réouverture de OUT. Tu as ton tes fichiers filles de créés !
Y a surement plus performant comme algorithme mais parfois vaut mieux choisir quelque chose de simple et clair plutot que choisir quelque chose d'ilisible !