Χρήστης:AtouBot/xml-split-by-numpages.pl
Εμφάνιση
Όνομα εργαλείου: xml-split-by-numpages.pl
Περιγραφή:
Αυτό το εργαλείο διαβάζει κείμενο σε μορφή xml και καταγράφει μια σειρά αρχείων με ορισμένο αριθμό σελίδων στο καθένα.
Παράμετροι:
--numαριθμός σελίδων ανά αρχείο (προεπιλογή: 1000)--nameόνομα αρχείων (θα έχουν τη μορφή blot_1, blot_2, κλπ, προεπιλογή: xmlpages)
Προϋποθέσεις:
- perl
Σημειώσεις χρήσης:
- Παράδειγμα χρήσης:
cat elwiktionary-20080309-pages-meta-current.xml | ./xml-split-by-numpages.pl- Θα δημιουργήσει στον παρόν κατάλογο αρχεία xmlpages_1, xmlpages_2 κλπ.
cat elwiktionary-20080309-pages-meta-current.xml | ./xml-split-by-numpages.pl --num 50000 --name tmp/el-apr2011- Θα δημιουργήσει στον κατάλογο tmp τα αρχεία el-apr2011_1, el-apr2011_2 κλπ. Ο κατάλογος tmp πρέπει να υπάρχει ήδη, δεν θα δημιουργηθεί.
→ Πίσω στα Εργαλεία |
xml-split-by-numpages.pl
[επεξεργασία]#!/usr/bin/perl
# γράφουμε αρχεία με ορισμένο αριθμό σελίδων στο καθένα
# παράδειγμα:
# cat elwiktionary-20080309-pages-meta-current.xml |./xml-split-by-numpages.pl --num 50000 --name tmp/el-apr2011
use utf8;
#!/usr/bin/perl
$num=1000; #default
$name="xmlpages"; # default
sub skip_header {
$line = <STDIN>;
if ($line !~ /<mediawiki /) {
print FILE $line;
return;
}
print "found header\n";
while (<STDIN>) {
if ($_ =~ /<\/siteinfo>/ ) {
print "returning\n";
return;
}
}
return;
}
sub write_page {
while (<STDIN>) {
$line = $_;
# too bad, this is an extra compare for each line, ah well I'm lazy
if ($_ !~ /<\/mediawiki>/) {
print FILE $_;
}
if ($line =~ /<\/page>/) {
return(1)
}
}
return(0)
}
while ($opt = shift(@ARGV)) {
if ($opt =~ /--num/) {
$num = shift(@ARGV);
# FIXME check it's numerical someday
}
elsif ($opt =~ /--name/) {
$name = shift(@ARGV);
}
else {
print "Usage: $0 --num number-of-articles-per-chunk --name base-filename\n";
exit(-1);
}
}
$count = 0;
$filecount = 1;
open(FILE,'>',$name."_".$filecount) || die "failed to open first file $name_$filecount for output";
skip_header();
$result = write_page();
if (! $result) {
close(FILE);
print "failed to write the first page, check your data";
exit(1);
}
while (1) {
$result = write_page();
if (! $result) {
close(FILE);
exit(0);
}
$count++;
if (! ( $count % $num ) ) {
close(FILE);
$filecount++;
open(FILE,'>',$name."_".$filecount);
}
}