Einzelnen Beitrag anzeigen

moonwhaler

Registriert seit: 22. Dez 2005
57 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 10:23
Hi,

ich hatte ein ähnliches Problem (bei mir ging es vor allem um Sortierung) vor nicht allzulanger Zeit und habe da einige kleine Funktionien gebastelt. Die decken leider nicht alle Sonderfälle ab, aber ich denke man kann diese notfalls sicher erweitern:

Delphi-Quellcode:
function ExtractNumberFromString( s: String ): String;
function ExtractIntegerFromString( s: String ): Integer;
Delphi-Quellcode:
function ExtractIntegerFromString( s: String ): Integer;
var
  i: Integer;
  tmpstr: String;
begin
  tmpstr := '';

  // String cleanup...
  while ( pos( ' ', s ) > 0 ) do
    s := StringReplace( s, ' ', ' ', [rfReplaceAll, rfIgnoreCase] );

  // Extract the number (that maybe contains alphanumeric data)
  s := ExtractNumberFromString( trim( s ) );

  // Now try to get all NUMERIC data - in case the current char is not
  // NUMERIC break the loop. That will prevent to add a "false" number
  // like in street names "maggiestreet 22/2b" >> "22"
  for i:=1 to length( s ) do
    if ( s[i] in ['0'..'9'] ) then
      tmpstr := tmpstr + s[i]
    else
      break;

  result := StrToIntDef( tmpstr, -1 );
end;

function ExtractNumberFromString( s: String ): String;
var
  i: Integer;
  currentdepth: Byte;
  lastknown: SmallInt;
const
  maxdepth: Byte = 4;
begin
  result := '';
  currentdepth := 0;
  lastknown := 0;

  for i:=length( s ) downto 1 do
  begin
    if ( s[i] in ['0'..'9'] ) then
    begin
      lastknown := i;
      currentdepth := 0;
    end else
      inc( currentdepth );

    if ( currentdepth > maxdepth ) then
    begin
      if ( lastknown > 0 ) then
        result := copy( s, lastknown, length( s ) );

      break;
    end;
  end;
end;
Grundsätzlich arbeiten beide Funktionen recht ähnlich. Ein Beispiel:
Neumannstrasse 22 c

Ergebnis (ExtractNumberFromString):
22 c

Ergebnis (ExtractIntegerFromString):
22

Man kann die Tiefe der Suche entsprechend anpassen, d.h. wann gilt eine Hausnummer noch als Hausnummer und wann nicht mehr. Tiefe bedeutet also alle nicht numerischen Zahlen:

maxdepth: Byte = 4; Es ging mir dabei wie gesagt primär um die korrekte (natürliche) Sortierung von Strassen inklusive Hausnummern. Bitte verzeih, dass dabei derzeit der Strassenname selbst nicht ausgegeben wird. Dies wäre aber ebenfalls leicht erweiterbar. Ich hoffe das hilft wenigstens ein bischen...
  Mit Zitat antworten Zitat