All pastes #13534 Raw Edit

Untitled

public text v1 · immutable
#13534 ·published 2005-06-06 14:11 UTC
rendered paste body
#!/usr/bin/perl -w
#
# convert an exported .txt file to our tesaurus xml schema
#

use strict;

#holds a tesaurus entry
my %record;
#elements order in entry
my @element_order = (
	'notes' => ['M:', 'H:', 'T:', 'Vált:', 'B:', 'Forrás:'],
	'connections' => ['L', 'LV', 'LAND', 'H', 'HV', 'HAND', 'F', 'A', 'T', 'P', 'E', 'R', 'X', '=']
);

#for my $item (@element_order) {
#	foreach my $key (keys %$item) {
#		print "$key\n";
#		for my $element (@{$item->{$key}}) {
#			print "$element ";
#		}
#		print "\n\n";
#	}
#}
#
#%record = ();
#
#exit;

if ((scalar @ARGV) != 2) {
	print "Usage:\ntxt2xml <txt filename> <xml filename>\n";
	exit;
}

open (my $TXTFILE, '<', $ARGV[0]) or die "A szovegfajlt (".$ARGV[0].") nem tudtam megnyitni.\n";
open (my $XMLFILE, '>', $ARGV[1]) or die "Az xmlfajlt (".$ARGV[1].") nem tudtam irasra megnyitni.\n";


write_xml_header($XMLFILE);

while (next_txt_record($TXTFILE, \%record)) {
	write_xml_record($XMLFILE,  \%record, \@element_order);
}

write_xml_footer($XMLFILE);




#================================================================
# subsequences
# ===============================================================


sub write_xml_header
{
	my ($xml_ref) = @_;
	
	print $xml_ref	"<?xml version=\"1.0\" encoding=\"iso-8859-2\"?>\n".
			"<entries xmlns=\"http://www.nava.hu/koztaurusz_schema.xml\">\n\n";
}


sub write_xml_footer
{
	my ($xml_ref) = @_;
	
	print $xml_ref "\n</entries>\n";
}


sub write_xml_record
{
	my ($xml_ref, $rec_ref, $order_ref) = @_;
	
	print $xml_ref "\n\t<entry>\n";

	print $xml_ref "\t\t<name>".$rec_ref->{'name'}."</name>\n";
	print $xml_ref "\t\t<id>".$rec_ref->{'id'}."</id>\n";
	

	print $xml_ref "\t\t<notes>\n";
		for my $key ($order_ref->{'notes'}) {
			if (exists($rec_ref->{$key.':'})) {
				for my $item ($rec_ref->{$key.':'}) {
					print "\t\t\t<$key>$item</$key>\n";
				}
			}
		}
	print $xml_ref "\t\t</notes>\n";
	

	print $xml_ref "\t\t<connections>\n";
                for my $key ($order_ref->{'connections'}) {
                        if (exists($rec_ref->{$key})) {
                                for my $item ($rec_ref->{$key}) {
                                        print "\t\t\t<$key>$item</$key>\n";
                                }
                        }
                }
	print $xml_ref "\t\t</connections>\n";

	print $xml_ref "\t</entry>\n";
}


sub next_txt_record
{
	my ($txt_ref, $record_ref) = @_;
	my $first = 1;
	my $line;
	my $last_mark = '';
	
	%$record_ref = ();

	while ($line = <$txt_ref>) {
		#handle empty lines
		if ($line eq "" ){
			if ($first) {
				return 0;
			} else {
				last;
			}
		}
		$first = 0;
		
		#do the job
		$last_mark = process_line($line, $record_ref, $last_mark);
	}
	
	if ($first) {
		return 0;
	} else {
		return 1;
	}
}


#i suppose that the file is a well-structured text file
sub process_line
{
	my ($line, $record_ref, $preceding) = @_;
	my $this_mark = $preceding;
	
	if ($line =~ m/^([^\s].*)$/) {
		#leaderword line
		$record_ref->{'name'} = $1;
		$record_ref->{'id'} = get_my_id($record_ref->{'name'});
	} elsif ($line =~ m/^[\s]([^\s]+)[\s]+(.*)$/) {
		#connection
		if ($1 eq 'L&') {
			$_ = 'LAND';
		} elsif ($1 eq 'H&') {
			$_ = 'HAND';
		} else {
			$_ = $1;
		}
		SWITCH: {
                        if (/M:/) {$record_ref->{$_} = [$2]; last SWITCH;}
                        if (/H:/) {$record_ref->{$_} = [$2]; last SWITCH;}
                        if (/T:/) {$record_ref->{$_} = [$2]; last SWITCH;}
                        if (/Vált:/) {$record_ref->{$_} = [$2]; last SWITCH;}
                        if (/B:/) {$record_ref->{$_} = [$2]; last SWITCH;}
                        if (/Forrás:/) {$record_ref->{$_} = [$2]; last SWITCH;}

                        if (/L/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/LV/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/LAND/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

                        if (/H/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/HV/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/HAND/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

               		if (/F/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/A/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

                        if (/T/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/P/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

                        if (/E/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}
                        if (/R/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

                        if (/X/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;}

			if (/=/) {$record_ref->{$_} = [get_my_id($2)]; last SWITCH;} #homoníma
		}
		$this_mark = $1;
	} elsif ($line =~ m/^[\s]{2}(.*)$/) {
		my $lgth = scalar $record_ref->{$this_mark};
		$record_ref->{$this_mark}->[$lgth] = $1;
		#$record_ref->{$this_mark} = $1;
	}
	
	return $this_mark;
}


#value of the maximal id ever delivered
our $maxid = 0;
#hash of name-id pairs
our %ids;
sub get_my_id
{
	my ($name) = @_;
	
	if (!(exists $ids{$name})) {
		$ids{$name} = $maxid++;
	}
	
	return $ids{$name};
}