Όνομα εργαλείου: 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);
    }
}