Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#7

AW: MAC-Hersteller-Zuordnung bzw. Wie mit einem sehr großen Datensatz umgehen?

  Alt 23. Mär 2017, 23:25
Parser wäre da wohl deutlich übertrieben

Mein Editor unterstützt die Nutzung von Pascal-Script.

Und dafür hab' ich mir halt folgenden Quelltext zusammengedaddelt:
Delphi-Quellcode:
program Test;
var
        i : Integer;
        k : Integer;
        s : String;
        sCase : String;

procedure Dubletten;
begin
  GetSelText;
  s := '';
  for i := 0 to SelText.Count - 1 do begin
    if s = Copy(SelText[i],1,6) then begin
       WriteLn(Format('Dublette %s',[Copy(SelText[i],1,6)]));
       WriteLn(Format('Dublette %s',[Copy(SelText[i - 1],8,4096)]));
       WriteLn(Format('Dublette %s',[Copy(SelText[i],8,4096)]));
    end;
    s := Copy(SelText[i],1,6);
  end;
end;

procedure CaseErstellen;
begin
  GetSelText;
  k := 0;
  s := AnsiReplaceText(Copy(SelText[0],8,4096),'''',''''' ');
  s := '';
  sCase := '';
  for i := 0 to SelText.Count - 1 do begin
    if s <> AnsiReplaceText(Copy(SelText[i],8,4096),'''',''''' ') then begin
      WriteLn(Format(' %s: Result := ''%s'';',[sCase,s]));
      s := AnsiReplaceText(Copy(SelText[i],8,4096),'''',''''' ');
      sCase := '$' + Copy(SelText[i],1,6);
    end else begin
      if Length(sCase) = 70 then begin
        WriteLn(Format(' %s,',[sCase]));
        sCase := '';
      end;
      if sCase = 'then sCase := '$' + Copy(SelText[i],1,6) else sCase := sCase + ', $' + Copy(SelText[i],1,6);
    end;
  end;
  WriteLn(Format(' %s: Result := ''%s'';',[sCase,s]));
end;

procedure InitErstellen;
begin
  GetSelText;
  k := 0;
  for i := 0 to SelText.Count - 1 do begin
    if (i mod 500 = 0) then begin
      if i > 0 then begin
        WriteLn('end;');
        WriteLn('');
      end;
      Output.Add(Format(' procedure Init%0.3d;',[k]));
      WriteLn(Format('procedure tNMap_Mac_List.Init%0.3d;',[k]));
      WriteLn('begin');
      k := k + 1;
    end;
    WriteLn(Format(' fHex.Add(''%s''); fName.Add(''%s'');',[Copy(SelText[i],1,6),AnsiReplaceText(Copy(SelText[i],8,4096),'''',''''' ')]));
  end;
  WriteLn('end;');
end;

begin
  // InitErstellen;
  // CaseErstellen;
  Dubletten;
end.
GetSelText holt den im Editor markierten Text, SelText ist 'ne Stringliste mit eben diesem Text und WriteLn schreibt in ein Ausgabefenster (ein TMemo).

Der Rest ist "handelsübliches" Delphi und einbisserl Schreibarbeit

Wenn Du das auf Delphi umbauen möchtest, musst Du halt noch zwei Stringlisten machen.

Delphi-Quellcode:
SelText := TStringList.Create;
Ausgabe := TStringList.Create;
SelText.LoadFromFile('nmap-mac-prefixes.txt');
// Statt WriteLn(...); halt Ausgabe.Add(...);
Ausgabe.SaveToFile('nmap_mac_prefixes.inc');
Ausgabe.Free;
SelText.Free;
Und damit dürfte es mit marginaler Nacharbeit möglich sein, ggfls. aus 'ner neuen nmap-mac-prefixes.txt den Case-Teil zu generieren.

Für die Dublettenprüfung muss die Datei nmap-mac-prefixes.txt ab der 1. Spalte sortiert sein, für das Erstellen des Case-Teiles und die erste Stringlistenvariante ab der 8. Spalte.
  Mit Zitat antworten Zitat