Parsanje naslovov, hišnih številk, dodatkov etc...

Odpiranje, tiskanje, pisanje v datoteke in drugo.
Odgovori
peterv
Prispevkov: 987
Pridružen: 29.03.2002 13:24:32

Parsanje naslovov, hišnih številk, dodatkov etc...

Odgovor Napisal/-a peterv » 06.03.2006 14:58:33

Za popizdit je delat z bankami in zavarovalnicami skupaj... huhhh...
Torej banka izda neko datoteko v kateri je naslov + hišna številka + dodatek...

ali ima morda kdo narejen kakšen "parser", ki to zadevo izlušči.. ulico v eno variablo, hišno št v drugo in dodatek v tretjo?
Možne kombinacije pa so recimo:

betnavska cesta 1
pot heroja tratnika 24
studenec 2 a
cesta v nebesa 008B
pot v neznano 8/D

skratka nobene pametne strukture..

p.s: te podatke dobim iz datoteke in ulico + hšt + dodatek je en podatek... spet pa ne velja nobeno pravilo saj je lahko dodatek hšt ločen s presledkom, /, ali kar skupaj s številko..
če ma kdo kakšno funkcijo že spisano bi ga prosil za pomoč, ker moram poleg ostalih 4 projektov se še s temi jajci ubadat... (je pa to Hypo banka + zavarovalnica Adriatic Slovenica, ki ima tako stukturo... informatiki na obeh omenjenih mestih se sklicujejo, da imajo delo z eurom in da ne morejo pripravit pametnejše oblike zapisa..)

Melhijad
Prispevkov: 160
Pridružen: 23.08.2004 13:34:55

Parsanje naslovov, hišnih številk, dodatkov etc...

Odgovor Napisal/-a Melhijad » 06.03.2006 15:12:17

Če ni pametnega formata, potem pač boš težko (pravilno) izluščil karkoli. Tem informatikom na oni strani pa tudi ne bi smelo biti tako hudimano težko na konec vsakega "polja" še kak #7.

Pa fantje, no... ne se hecat.

knightG
Prispevkov: 163
Pridružen: 19.05.2001 15:20:12

Parsanje naslovov, hišnih številk, dodatkov etc...

Odgovor Napisal/-a knightG » 06.03.2006 18:38:13

Negravzno :)
Jaz bi poskusil z regular expresni. Torej ulica bi bila vse kar je zacetek stringa pa do stevilk (brez spaceov).
Hisna stevilka sledi spacu in je obvezno stevilka, ki ne vsebuje nobenih dodatkov
Vse kar sledi temu in je oblike space, pika, slash, backslah je sranje.
Ce je za tem se kaj je to dodatek.
Recimo:
[a-zA-Z\s]+ - za parsanje imena ulice(zbrises vse trailing space)
[0-9]+ - za parsanje stevilke
kar ostane (brez slashov in ostalega je dodatek).

Za demonstracijo si poglej regex coach.

lp,
Gregor
Zadnjič spremenil knightG, dne 06.03.2006 18:39:53, skupaj popravljeno 1 krat.
----------------------------------------------------------------
How do you keep a programmer in the shower all day?
Give him a bottle of shampoo which says "lather, rinse, repeat."
-----------------------------------------------------------------

knightG
Prispevkov: 163
Pridružen: 19.05.2001 15:20:12

Parsanje naslovov, hišnih številk, dodatkov etc...

Odgovor Napisal/-a knightG » 06.03.2006 18:44:02

Se za dodatek:
.*[a-zA-Z]

pazi le, da premikas pointer naprej.

lpg
----------------------------------------------------------------
How do you keep a programmer in the shower all day?
Give him a bottle of shampoo which says "lather, rinse, repeat."
-----------------------------------------------------------------

peterv
Prispevkov: 987
Pridružen: 29.03.2002 13:24:32

Parsanje naslovov, hišnih številk, dodatkov etc...

Odgovor Napisal/-a peterv » 07.03.2006 09:55:12

Evo na hitro sem "malo na špartansko " rešil zadevo, ki ti sparsa ulico ,hišno številko in dodatek (recimo da bo v 90% bilo ok)
funkcija isNumber preverja samo če recimo hišna številka vsebuje konkateniran kakšen dodatek.. oziroma če najde da je to dodatek vrne false.. če najde da so števila 0..9 potem vrne true...

V funkcijo parse se poda (klobaso (v mojem primeru dobesedno nestrukturirane klobase)) dobimo pa ven ulico, hišno številko in hišni dodatek.....

Koda: Izberi vse

  

function TForm1.isNumber(podatki : String) : boolean;
var i: integer;
tm: String;
t : Char;
begin
    result := true;
    tm := podatki;
    for i:=1 to length(tm) do begin
        if (tm[i] in (['a'..'z', 'A'..'Z', '\','/','-']) )then
        begin
            result := false;
            exit;
        end;
    end;
    result := true;
end;

/////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.parse( UlicaVhod : String; var ulica,hst,dhst: String);
var p: TStringList;
    c,x,y,q,i: Integer;
    max: Integer;
    tmp,tmp1 : String;
    ul : boolean;
begin
   ulica := '';
   hst := '';
   dhst := '';

   if ((UlicaVhod='') or (length(trim(ulicaVhod))<1)) then exit;

   p := TStringList.Create;
   p.Delimiter := ' ';
   p.DelimitedText := UlicaVhod;
   max:=p.Count - 1;

   //če je samo en podatek vzamemo da je to ulica
   if (max=0) then begin
      ulica := p[max];
      hst := '';
      dhst := '';
      exit;
   end;

   //če je zadnji podatek char in predzadnji številka konateniraj
   if ((isNumber(p[max])= false) and (isNumber(p[max-1])= true)) then
   begin

       p[max-1] := p[max-1] + p[max];
       max := max -1;
   end;

   //
   ul := true;
   if (max > 0) then begin
      tmp := p[max];
      if (isNumber(tmp) = true) then
      begin
        dhst := '';
        hst := tmp;
        for i:=0 to max -1 do
         ulica := ulica +' ' + p[i];
      end
      else
      begin
        ul := false;
        for i:=1 to length(tmp) do
        begin
         if (isNumber(tmp[i]) = true) then
          hst:=hst+tmp[i]
          else
          dhst:=dhst+tmp[i];
        end;
      end;
      if (ul = false) then
      begin
         for i:=0 to max -1 do
         ulica := ulica +' ' + p[i];
      end;
   end;
end;

Odgovori