OVH Cloud OVH Cloud

Html & split

61 réponses
Avatar
ptilou
Bonsoir,

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.

Mer=E7i

Ptilou

10 réponses

1 2 3 4 5
Avatar
Paul Gaborit
À (at) Tue, 14 Jun 2005 18:08:26 +0200,
"Jacques Caron" écrivait (wrote):
Salut,

On 14 Jun 2005 07:42:34 -0700, wrote:

~$ ./cut-perl Grd.html
./cut-perl: line 1: syntax error near unexpected token `IN,'
./cut-perl: line 1: `open (IN, "< file.html");'
Faut pas mettre split queque part ?


Faut surtout mettre un #!/usr/bin/perl -w ou #!/usr/local/bin/perl -w au
début, sinon ton shell (bash) ne sait pas que c'est du perl...


Ou faire :

~$ perl ./cut-perl Grd.html

;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
ptilou
Bonsoir,

À (at) Tue, 14 Jun 2005 18:08:26 +0200,
"Jacques Caron" écrivait (wrote):
Salut,

On 14 Jun 2005 07:42:34 -0700, wrote:

~$ ./cut-perl Grd.html
./cut-perl: line 1: syntax error near unexpected token `IN,'
./cut-perl: line 1: `open (IN, "< file.html");'
Faut pas mettre split queque part ?


Faut surtout mettre un #!/usr/bin/perl -w ou #!/usr/local/bin/perl -w au
début, sinon ton shell (bash) ne sait pas que c'est du perl...


Ou faire :

~$ perl ./cut-perl Grd.html

Voili, voila :

~$ ./cut-perl Grdart.html
readline() on closed filehandle IN at ./cut-perl line 5.

;-)
C'est gentille !

Euh pourquoi sed s'arrete a 389329 lignes alors que j'ai 719555 lignes
?
La commande :
sed -n "/</HTML>/=" file.html

Et command je fais pour que la sorti de ci-dessus soit ligne par ligne
l'argument de l= pour split ?

J'insiste, sa doit créer 3255 fichier, alors que split me di max 622 ?
j'ai essayer prefixe, il me renvoie à la doc !

Merçi

Ptilou



Avatar
Jérémy JUST
On 14 Jun 2005 10:16:25 -0700
wrote:

il me renvoie à la doc !


Nous aussi, d'ailleurs.

--
Jérémy JUST

Avatar
Jérémy JUST
On 14 Jun 2005 07:42:34 -0700
wrote:

~$ ./cut-perl Grd.html
^^^^^^^^

Là, tu donnes le nom du fichier sur la ligne de commande


./cut-perl: line 1: `open (IN, "< file.html");'
^^^^^^^^^

Là, il est codé en dur.

Un truc simple à faire serait:

open (IN, "< $_[$[]") or die ;
open (OUT, "> $_[$[].out") or die ;


--
Jérémy JUST

Avatar
ptilou
Bonsoir,
Bonsoir,

On 14 Jun 2005 07:42:34 -0700
wrote:

~$ ./cut-perl Grd.html
^^^^^^^^

Là, tu donnes le nom du fichier sur la ligne de commande


./cut-perl: line 1: `open (IN, "< file.html");'
^^^^^^^^^

Là, il est codé en dur.

J'ai cette erreur :

Filehandle OUT opened only for output at ./cut-perl line 12.

Filehandle OUT opened only for output at ./cut-perl line 12.
</body>
Filehandle OUT opened only for output at ./cut-perl line 12.
</html>

Il crée les fichiers mais vide ...

Ptilou


Avatar
damien guerin
Ah ben vi... Moi je le lancais par "perl script.pl".
Ralala
Avatar
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;
Avatar
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

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

Avatar
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 !
1 2 3 4 5