Χρήστης:AtouBot/xml-split-by-lang.pl
Εμφάνιση
Όνομα εργαλείου: xml-split-by-lang.pl
Περιγραφή:
Αυτό το εργαλείο χωρίζει ένα αρχείο xml με σελίδες από το ΒΛ σε αρχεία ανά γλώσσα. Κάθε καινούργιο αρχείο ονομάζεται με το κωδικό γλώσσας των σελίδων που περιέχει.
Παράμετροι:
- δεν έχει παραμέτρους
Προϋποθέσεις:
- perl
Σημειώσεις χρήσης:
- Το εργαλείο δημιουργεί πάνω από 200 αρχεία στον τρέχον κατάλογο. Ο χρήστης καλό θα κάνει να δημιουργήσει ειδικό κενό κατάλογο και να τρέξει το εργαλείο από εκεί.
- Σελίδες χωρίς πρότυπο γλώσσας τοποθετούνται στο ειδικό αρχείο «junk».
- Λήμματα που ανήκουν σε περισσότερες από μία γλώσσες θα προστεθούν σε όλα τα κατάλληλα αρχεία. Η σελίδα όλη καταγράφεται, δεν χωρίζεται σε τμήματα.
- Παράδειγμα χρήσης (από κενό υποκατάλογο):
bzcat ../elwiktionary-20100217-pages-meta-current.xml.bz2 | perl ../xml-split-by-lang.pl
→ Πίσω στα Εργαλεία |
xml-split-by-lang.pl
[επεξεργασία]#!/usr/bin/perl
# αυτό το σκριπτάκι ( :-P ) χωρίζει το αρχείο xml σε αρχεία ανά
# γλώσσα
# αν μια σελίδα δεν έχει έγκυρη επικεφαλίδα γλώσσας,
# θα καταγραφεί στο ειδικό αρχείο "junk"
# όλες οι ανακατευθύνσεις γράφονται στο αρχείο "redirs"
# καλό είναι να φτιάξεις υποκατάλοκο και από εκεί να
# τρέξεις το σκριπτ
# Παράδειγμα χρήσης:
# cat elwiktionary-20080309-pages-meta-current.xml | ./xml-split-by-lang.pl
binmode(STDOUT, ":utf8");
binmode(STDIN, ":utf8");
$junkfile="junk";
$noheader="no header";
$redirfile="redirs";
$redirheader="redir header";
use encoding(UTF8);
sub set_up_filehandle {
my $langcd = shift(@_);
my $filename;
local *FILE;
if ($langcd =~ m/no header/) {
$filename = $junkfile;
}
elsif ($langcd =~ m/redir header/) {
$filename = $redirfile;
}
else {
$filename = lc($langcd);
}
if (! $file{$filename}) {
open(FILE,'>',$filename);
binmode(FILE, ":utf8");
$file{$filename} = *FILE;
}
return($file{$filename});
}
# μπορεί να γράψουμε μία σελίδα σε πολλαπλά αρχεία, αν ανήκει
# ένα λήμμα σε περισσότερες από μία γλώσσες
sub do_scan {
my(@text)=@_;
@write_to_these=();
$pagetype="unknown";
for $tline (@text) {
if ($tline =~ /<title>/) {
if ($tline !~ /<title>.*:.*<\/title>/) {
$pagetype="main namespace";
}
else {
$pagetype="other";
}
}
if ($pagetype =~ /other/) {
return(0);
}
if ($pagetype =~ /main namespace/) {
if ($tline =~ /== *\{\{-([a-z\-διεθνμτγσ]+)-\}\}/) {
$lang = $1;
if ($tline !~ /<comment>/) {
@fhs = &set_up_filehandle($lang);
push(@write_to_these,@fhs);
}
}
elsif (($tline =~ /#REDIRECT/ig) || ($tline =~ /#ΑΝΑΚΑΤΕΥΘΥΝΣΗ/ig)) {
@fhs = &set_up_filehandle($redirheader);
push(@write_to_these,@fhs);
}
}
}
if ($#write_to_these < 0) {
# δεν έχουμε επικεφαλίδα γλώσσας, ούτε ανακατεύθυνση
@fhs = &set_up_filehandle($noheader);
push(@write_to_these,@fhs);
}
return(@write_to_these);
}
$startpage=0;
while (<STDIN>) {
$line=$_;
if ($line =~ /<page>/) {
$startpage++;
@text=();
}
elsif ($line =~ /<\/page>/) {
@text=(@text,$line);
$startpage=0;
@langs = &do_scan(@text);
foreach $fh (@langs) {
for my $textline (@text) {
print $fh "$textline";
}
}
@text=();
}
if ($startpage) {
@text=(@text,$line);
}
}
foreach $fkey (%file) {
close($file{$key});
}
exit(0);