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

3 4 5 6 7
Avatar
Paul Gaborit
À (at) Wed, 15 Jun 2005 17:03:38 +0200,
Stephane Zuckerman écrivait (wrote):
C'est étrange, parce qu'on utilise généralement .pm pour les
bibliothèques, et .pl pour les programmes. En fait c'est le cas pour
100% des programmes perl que j'ai vu! J'ai vu des librairies en .pl il y a
des années (du temps de perl 4) mais à part ça...

En tout cas, vim me met en mode perl si l'extension .pl est là et pas .plx

;-)
Idem pour emacs.


.pm signifie « Perl Module » (.pm ou .PM : c'est imposé par le langage)

.pl signifiait effectivement « Perl Library » mais ne devrait plus être
utilisé depuis Perl 5 (ça date de perl 4 ou avant).

Après, le choix de l'extension pour les scripts est purement conventionnel.

Certains conserve .pl car ce n'est plus utilisé et la plupart des éditeurs de
texte reconnaissent alors le fichier comme contenant du Perl.

D'autres choisissent de ne pas mettre d'extension du tout (les commandes Unix
n'ont que très rarement pour ne pas dire jamais une extension). Les éditeurs
intelligents vont chercher à comprendre la nature du contenu et, ne pouvant
plus se baser sur l'extension, ils regardent la première ligne (le
shebang). Si il contient 'perl'... C'est du Perl !

Et si cette première ligne ne contient pas 'perl', (X)Emacs (les autres je ne
sais pas) cherche encore dans les premières lignes la chaîne "-*- perl -*-"
pour se dire que c'est du Perl.

Sur les plateformes qui en sont encore à la reconnaissance par les extensions,
on peut choisir son association. Certains choisissent .pl (ou plutôt la
distribution de Perl utilisée choisit pour eux). Mais ils devraient en fait
prendre .plx !

Pour vim, il doit y avoir moyen d'associer l'extension .plx à Perl (il faut
demander aux utilisateurs compétents du bidule...).

Mais, tout cela est purement conventionnel. Donc, au final, chacun fait comme
il veut... ;-)

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


Avatar
ptilou
Bonjour,

damien guerin wrote:
aaaa</HTML>bbbb sera dans le même fichier...
Mais tu peux faire :
if ($line =~ s/(.*</HTML>).*/$1/) {
Du coup tu ne mettera que aaaa</HTML> dans le fichier...!
Le vrai hic d'apres moi c'est si y a </HTML>toto<HTML> sur la même
ligne... là !
Dans le script que je t'ai fourni on teste que sur </HTML> pour être
plus efficace il faudrait controler <HTML> avec. Enfin bref, je pensais
que tu voulais un truc rapide qui marche dans des cas simples...


J'ai fais ça :open (IN, "<$_[$[]");
open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ s/(.</HTML>).*/$1/) {
$cpt++;
print OUT $line;
close OUT;
rename "out.tmp", $cpt.".html";
open (OUT, ">out.tmp");
} else {
print OUT $line;
}
}
close OUT;

C'est planté à :$ ./script-html.pl file.html
Use of uninitialized value in concatenation (.) or string at
./script-html.pl line 3.
readline() on closed filehandle IN at ./script-html.pl line 6.

Le premier script ne prend pas en compte certain ligne, j'ai fais
un sed s"/>/> t/g" file.html, j'ai toujour le même résultat ?

Merçi

Ptilou

Avatar
Nicolas Le Scouarnec
open (IN, "<$_[$[]");


C'est quoi se truc horrible ?
Quelqu'un a montré une solution utilisant ARGV et foreach, tu n'as qu'a
t'en inspirer, parce que la... tu cherche la variable a la case $[ du
tableau implicite... En perl, faut pas essayer de jouer au gourou quand
on en maitrise pas toutes les subtilités.

Sinon, un truc, je me demande si "s$a[0]" marche ou s'il faut faire:
"s".$a[0] (les crochets entre des "", il y a des cas ou ca ne marche
pas, je ne sais plus trop, je mélange peut-etre les langages en plus,
mais bon).

open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ s/(.</HTML>).*/$1/) {


Ca, c'est.... bizarre... Pourquoi un . après la parenthèse ouvrante ?
En plus, fait gaffe, tu perd ce qui est après le </HTML> sur la
ligne... A toi de voir. Avec un deuxieme jeu de parenthèses autout du
.*, tu peux le recuperer dans $2 et après le rename et le open, tu
fais: print OUT $2 (juste avant le else).

$cpt++;
print OUT $line;
close OUT;
rename "out.tmp", $cpt.".html";
open (OUT, ">out.tmp");
} else {
print OUT $line;
}
}
close OUT;



C'est planté à :$ ./script-html.pl file.html
Use of uninitialized value in concatenation (.) or string at
./script-html.pl line 3.


C'est quoi la ligne 3 de ton script ? $cpt=0 ??

readline() on closed filehandle IN at ./script-html.pl line 6.


Le open(IN,...) n'aurait-il pas raté ?

Le premier script ne prend pas en compte certain ligne, j'ai fais


Quelle ligne. A priori, il prenait tout de manière globale pourtant...
Sauf si c'est du binaire, auquel cas, je n'ai aucune idée du résultat.

un sed s"/>/> t/g" file.html, j'ai toujour le même résultat ?


Quel résultat ?

--
Nicolas Le Scouarnec

Avatar
ptilou
Bonsoir,

Nicolas Le Scouarnec wrote:
open (IN, "<$_[$[]");


C'est quoi se truc horrible ?


C'est ce que j'ai pris plus haut ...

Quelqu'un a montré une solution utilisant ARGV et foreach, tu n'as qu'a
t'en inspirer, parce que la... tu cherche la variable a la case $[ du
tableau implicite... En perl, faut pas essayer de jouer au gourou quand
on en maitrise pas toutes les subtilités.



Ok ...

Sinon, un truc, je me demande si "s$a[0]" marche ou s'il faut faire:
"s".$a[0] (les crochets entre des "", il y a des cas ou ca ne marche
pas, je ne sais plus trop, je mélange peut-etre les langages en plus,
mais bon).

open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ s/(.</HTML>).*/$1/) {


Ca, c'est.... bizarre... Pourquoi un . après la parenthèse ouvrante ?
En plus, fait gaffe, tu perd ce qui est après le </HTML> sur la
ligne... A toi de voir. Avec un deuxieme jeu de parenthèses autout du
.*, tu peux le recuperer dans $2 et après le rename et le open, tu
fais: print OUT $2 (juste avant le else).



Tous pareil pris plus haut !

$cpt++;
print OUT $line;
close OUT;
rename "out.tmp", $cpt.".html";
open (OUT, ">out.tmp");
} else {
print OUT $line;
}
}
close OUT;



C'est planté à :$ ./script-html.pl file.html
Use of uninitialized value in concatenation (.) or string at
./script-html.pl line 3.


C'est quoi la ligne 3 de ton script ? $cpt=0 ??



Oui, c'est le compteur qui signalise ? C'est pour ça que je ne
comprend pas !

readline() on closed filehandle IN at ./script-html.pl line 6.


Le open(IN,...) n'aurait-il pas raté ?

Le premier script ne prend pas en compte certain ligne, j'ai fais


Quelle ligne. A priori, il prenait tout de manière globale pourtant...
Sauf si c'est du binaire, auquel cas, je n'ai aucune idée du résultat.



Non pour le binaire j'ai chercher dans mes archive, il me semple qu'il
faut :
open unpack -h (IN, "< fichier");
Pourquoi c'est pas pack ?

un sed s"/>/> t/g" file.html, j'ai toujour le même résultat ?


Quel résultat ?



Il me débite 513 fichiers, j'en ai qui ne le sont pas correctement
(dans un fichier plusieur fiche), et je me retrouve avec un tmp.out de
23 Mo ...
Donc c'est pas la bonne commande !

Ptilou


Avatar
Jérémy JUST
On Wed, 15 Jun 2005 19:20:28 +0000 (UTC)
Nicolas Le Scouarnec nospam. invalid> wrote:

open (IN, "<$_[$[]");
C'est quoi se truc horrible ?



Ce n'est pas très lisible, mais ça fait ce qu'on veut dans toutes les
situations (ie même quand on reprend le code d'un inconnu sans avoir
le temps de tout lire).


tu cherche la variable a la case $[ du tableau implicite...


Et $[ contient l'index du premier élément des tableaux (généralement
0, mais ça peut malheureusement se modifier). Donc on va bien chercher
la première case du tableau.


--
Jérémy JUST


Avatar
Nicolas Le Scouarnec
open (IN, "<$_[$[]");
C'est quoi se truc horrible ?

C'est ce que j'ai pris plus haut ...



J'ai appris un truc aujourd'hui...

open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ s/(.</HTML>).*/$1/) {




Ce que je ferrais.
if ($line =~ s/(</HTML>)(.*)/$1/) {

Ou:
if (($line =~ s/(.<s*/s*[Hh][Tt][Mm][Ll]s*>).*/$1/)) {
(si tu as besoin des minuscules, des balises < / html > (valide, il
me semble))

Ca, c'est.... bizarre... Pourquoi un . après la parenthèse ouvrante ?
En plus, fait gaffe, tu perd ce qui est après le </HTML> sur la
ligne... A toi de voir. Avec un deuxieme jeu de parenthèses autout du
.*, tu peux le recuperer dans $2 et après le rename et le open, tu
fais: print OUT $2 (juste avant le else).
Tous pareil pris plus haut !



Enleve le point dans les parenthèses. Ou met une étoile après le
point, mais la, tu ne pourras pas relever les lignes de la forme:
</HTML>fsdfdsfds
mais que:
fdsfsd</HTML>fdsfds ou
f</HTML>fdfsd

Et si tes <html> sont en minuscule, ca ne marche pas...


$cpt++;
print OUT $line;
close OUT;
rename "out.tmp", $cpt.".html";
open (OUT, ">out.tmp");




print OUT $2;

} else {
print OUT $line;
}
}
close OUT;



C'est planté à :$ ./script-html.pl file.html
Use of uninitialized value in concatenation (.) or string at
./script-html.pl line 3.


C'est quoi la ligne 3 de ton script ? $cpt=0 ??



Oui, c'est le compteur qui signalise ? C'est pour ça que je ne
comprend pas !


Tu as bien mis un 0 et pas un O ?
Ton script perl commence bien par #!/usr/bin/perl , il ne faut pas
oublier de le compter. On dirait quand meme qu'il a eu un probleme a la
ligne open(IN...) :

readline() on closed filehandle IN at ./script-html.pl line 6.
Le open(IN,...) n'aurait-il pas raté ?





Non pour le binaire j'ai chercher dans mes archive, il me semple qu'il
faut :
open unpack -h (IN, "< fichier");
Pourquoi c'est pas pack ?


Cf la page de manuel: perlfunc (man perlfunc, ligne 3605 chez moi).
A priori, pack/unpack, ca n'a pas l'air de s'utiliser comme cela.

Il me débite 513 fichiers, j'en ai qui ne le sont pas correctement
(dans un fichier plusieur fiche), et je me retrouve avec un tmp.out de
23 Mo ...
Donc c'est pas la bonne commande !


Cf le if (corrié) qui ne peut pas bien marcher.

--
Nicolas Le Scouarnec



Avatar
damien guerin
Si tu utilise use strict, il faut que tu mette my $cpt=0; !
Avatar
damien guerin
if (($line =~ s/(.<s*/s*[Hh][Tt][Mm][Ll]­s*>).*/$1/)) {

pourquoi pas ça plutot que je mettre des corchets :
if ($line =~ s/(.*<s*/s*HTML­s*>).*/$1/i) {

Bon en tout là, j'arrete c'est promis... Tu cherches meme pas, tu
attends que l'on fasse à ta place. Et quand on le fait par
gentillesse, t'es jamais contenent ! snif snif
Avatar
Jean-Philippe Caruana
Sur les plateformes qui en sont encore à la reconnaissance par les extensions,
on peut choisir son association. Certains choisissent .pl (ou plutôt la
distribution de Perl utilisée choisit pour eux). Mais ils devraient en fait
prendre .plx !

Pour vim, il doit y avoir moyen d'associer l'extension .plx à Perl (il faut
demander aux utilisateurs compétents du bidule...).


il faut mettre à jour le fichier filetype.vim
celui ci est "un peu" compliqué pour les fichiers perl, dans la mesure
ou apparement, les .pl peuvent servir aux fichiers prolog
Pour faire simple :

"Perl
au BufNewFile,BufRead *.pl,*.PL,*.plx setf Perl

en fait, c'est plutot ca :

" Perl
if has("fname_case")
au BufNewFile,BufRead *.pl,*.PL,*.plx call FTCheck_pl()
else
au BufNewFile,BufRead *.pl call FTCheck_pl()
endif

fun! FTCheck_pl()
if exists("g:filetype_pl")
exe "setf " . g:filetype_pl
else
" recognize Prolog by specific text in the first non-empty line
" require a blank after the '%' because Perl uses "%list" and
"%translate"
let l = getline(nextnonblank(1))
if l =~ '<prolog>' || l =~ '^s*(%+(s|$)|/*)' || l =~ ':-'
setf prolog
else
setf perl
endif
endif
endfun


Mais, tout cela est purement conventionnel. Donc, au final, chacun fait comme
il veut... ;-)


moi je garde pl ;-)

mes 0.2 euro


--
jpc
http://perso.enstimac.fr/~caruana/

Avatar
ptilou
Bonjour,

if (($line =~ s/(.<s*/s*[Hh][Tt][Mm][Ll]­s*>).*/$1/)) {

pourquoi pas ça plutot que je mettre des corchets :
if ($line =~ s/(.*<s*/s*HTML­s*>).*/$1/i) {



J'ai trouvé l'option i ou est que je dois la metre ?
i Reconnaissance de motif indépendamment de la casse
(majuscules/minuscules).
( C'est dans la doc !)
if ($line =~ i /</HTML>/)
la réponce :
Unquoted string "i" may clash with future reserved word at
./cut-perl2.pl line 7.
syntax error at ./cut-perl2.pl line 7, near "/) "
syntax error at ./cut-perl2.pl line 14, near "} else"
Execution of ./cut-perl2.pl aborted due to compilation errors.
Le script:

open (IN, "< file.html");
open (OUT, ">out.tmp");
$cpt=0;
while ($line = <IN>) {
if ($line =~ i /</HTML>/) {
## if (($line =~ s/(.<s*/s*[Hh][Tt][Mm][Ll]s*>)(.*)/$2/)){
$cpt++;
print OUT $line;
close OUT;
rename "out.tmp", $cpt.".html";
open (OUT, ">out.tmp");
} else {
print OUT $line;
}
}
close OUT;

Bon en tout là, j'arrete c'est promis... Tu cherches meme pas, tu
attends que l'on fasse à ta place. Et quand on le fait par
gentillesse, t'es jamais contenent ! snif snif


Mais, non, je sais pas exprimer ma joie ...
Un grand MERCI

Ptilou

3 4 5 6 7