Hi,
Gary68 wrote:
mir war so, als hätte mal jemand ein paar routinen geschrieben, um mit
einem file handle schnell an bestimmte stellen in osm files zu gelangen.
also zum start der ways oder dem start der relations im speziellen. hat
jemand einen tip, wo?
Binaere Suche in Textfiles, mein Steckenpferd ;)
sub seek_to_way_section
{
my $file = shift;
my
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
= $file->stat();
my $firstindex = 0;
my $lastindex = $size;
my $index = int($size * 0.75);
while(1)
{
my $buf;
$file->seek($index, SEEK_SET);
$file->read($buf, 1024);
my $waystart = index($buf, "<way id");
my $nodestart = index($buf, "<node id");
if (($waystart > -1) && ($nodestart > -1))
{
$file->seek($index + $waystart - 1, SEEK_SET);
return;
}
elsif ($waystart > -1)
{
$lastindex = $index;
$index = int(($index + $firstindex) / 2);
}
else
{
$firstindex = $index;
$index = int(($index + $lastindex) / 2);
}
}
}
Das wird dann aufgerufen mit
my $in = new IO::File $filename, "r";
seek_to_way_section($in)
und dann
while(<$in>)
usw.
Die 1024 in dem Code muss evtl. etwas groesser gewaehlt werden, sonst
koennte es sein, dass er mal was verpasst, ausserdem fehlt ne gute
Abbruchbedingung.
Bye
Frederik
_______________________________________________
Talk-de mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/talk-de