Χρήστης: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);