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