Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#62

AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.

  Alt 4. Mai 2015, 19:44
Ich hab eine Art Universal-Parser für Texte wie z. B. Metastase_LK_1_1_1_R_1 geschrieben. Man gibt nur GetCode('LK', 'Metastase_LK_1_1_1_R_1') und den gesuchten Code ein, z. B. LK und die Funktion liefert einen Array of Word mit den passenden Werten zurückt.

Delphi-Quellcode:
type
  TCodeW = array of Word;

  TCode = record
    CodeS: string;
    CodeW: TCodeW;
    Count: Integer;
    CodeSExists: Boolean;
  end;

function GetCode(ACodeS, AText: string): TCode;

  function GetNum(var s: string): Integer;
  var
    sTemp: string;
  begin
    while (Length(s) > 0) and not (s[1] in ['0'..'9']) do
      Delete(s, 1, 1);

    sTemp := '';
    while (Length(s) > 0) and (s[1] in ['0'..'9']) do
    begin
      sTemp := sTemp + s[1];
      Delete(s, 1, 1);
    end;

    if Length(sTemp) > 0 then
      Result := StrToInt(sTemp)
    else
      Result := -1;
  end;

var
  i, p: Integer;
  w: Integer;
  sTemp: String;
begin
  with Result do
  begin
    CodeS := AnsiUpperCase(ACodeS);
    SetLength(CodeW, 0);
    Count := 0;
    CodeSExists := False;

    //Evtl. ist es besser nach CodeS + '_' zu suchen, falls immer ein '_' folgt.
    p := Pos(CodeS, AnsiUpperCase(AText));
    //p := Pos(CodeS + '_', AnsiUpperCase(AText));
    CodeSExists := p > 0;
    if not CodeSExists then
      Exit;

    sTemp := '';
    for i := p + Length(CodeS) to Length(AText) do
      if AText[i] in ['0'..'9', '_'] then
        sTemp := sTemp + AText[i]
      else
        Break;

    repeat
      w := GetNum(sTemp);
      if w > - 1 then
      begin
        Inc(Count);
        SetLength(CodeW, Count);
        CodeW[Count - 1] := w;
      end;
    until w < 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Code: TCode;
  i: Integer;
begin
  Code := GetCode('L', 'Metastase_LK_1_1_1_R_1');

  ShowMessage('Gesuchter Code: ' + Code.CodeS);
  if Code.CodeSExists then
    ShowMessage('Text "' + Code.CodeS + '" ist im String vorhanden')
  else
    ShowMessage('Text "' + Code.CodeS + '" ist im String nicht vorhanden');
  ShowMessage('Anzahl: ' + IntToStr(Code.Count));
  for i := 0 to Code.Count - 1 do
    ShowMessage('Wert: ' + IntToStr(i + 1) + ' = ' + IntToStr(Code.CodeW[i]));
end;
Soviel ohne genau zu wissen um was es da geht.

Geändert von Popov ( 4. Mai 2015 um 21:33 Uhr) Grund: Eine kleine Erweiterung eingebaut
  Mit Zitat antworten Zitat