[Talk-de] seek (perl) in osm dateien

Frederik Ramm frederik at remote.org
Di Jul 27 15:58:18 UTC 2010


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





Mehr Informationen über die Mailingliste Talk-de