Einzelnen Beitrag anzeigen

Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#1

Eingelesene Zeile wird vorzeitig abgetrennt

  Alt 16. Mai 2014, 12:31
Hallo DP !

Ich habe diesmal meine Problemstellung weitestgehend selbst lösen können, allerdings gibt es eine Kleinigkeit, die ich mir nicht erklären kann. Ich untersuche folgende HTML-Reihen:

Code:
<tr class="odd">
<td><img title="IR" align="absmiddle" style="margin-right: 3px;" src="img/IR.png"><a title="yx" class="linkClass" onclick="displayLink('display?TRDB=NO&amp;RNID=08399806&amp;noBack=false'); return false" href="javascript:void(0)">08399806</a></td><td>yout title goes here</td><td>New</td><td>Lucky Luke - Online Support</td><td></td><td>Horses are unlucky</td><td>Maria Herbst</td><td>Tomatoes</td><td>16MAY14 07:41</td><td>16MAY14 07:41</td><td>Medium</td><td>
                            No
                   </td><td> </td><td>6653</td><td> </td><td></td>
</tr>
Insgesamt sind es über 300 solcher Reihen mit identischem Aufbau. Ich möchte jede Tablerow beginnend ab dem Suchwort: RNID= bis zum Reihenende </tr> untersuchen, ob darin bestimmte Zahlenreihen vorkommen. Im obigen Beispiel ist die 6653 versteckt.

Meine Lösung funktioniert im Prinzip recht gut und basiert auf einer Funktion und einer Prozedur:

Delphi-Quellcode:
//Diese Funktion gibt mir einen String zwischen einem Text zurück: aus RNID=1234& wird 1234
function getElementValue(const source, startStr, endStr: String; offset:integer):string;
var
  startIndex, endIndex: integer;
begin
  startIndex := PosEx(startStr, source, offset);
  offset := startIndex + 1;

  if (startIndex > 0) then
  begin
    startIndex := startIndex + Length(startStr);
    endIndex := PosEx(endStr, source, startIndex) + Length(endStr);
    Result := MidStr(source, startIndex, endIndex - startIndex-1);
  end
  else
    Result := '';
end;

//Die Prozedur soll das matching der IDs durchführen
procedure TFmain.Button9Click(Sender: TObject);
var
  i,y, p, startpos: Integer;
  s, rnid: string;
begin
  ListBox1.Clear;//Ergebnis Listbox leeren
  for i := 0 to RichEdit1.Lines.Count - 1 do //im Richedit befindet sich der gesamte HTML-Code mit den 300 Tablerows
  begin
    if Pos('RNID=', RichEdit1.Lines.Strings[i]) > 0 then
    begin
      s := '';
      {Die aktuelle Zeile wird nach der Zeichenfolge "RNID=" durchsucht
      und bei Erfolg ab der gefundenen Position ausgelesen, bis das schließende
       Tag </tr> auftritt...}


      for p := Pos('RNID=', RichEdit1.Lines.Strings[i]) to
        Length(RichEdit1.Lines.Strings[i]) do
        if RichEdit1.Lines.Strings[i][p] <> '</tr>then
          s := s + RichEdit1.Lines.Strings[i][p]
      else
        break;
       
      //Die Zeile wurde identifiziert, nun prüfen ob die SUCH-ID darin vorkommt
       rnid := getElementValue(s,'RNID=','&',1); //RNID aus der Zeile herauslösen

       for y := 0 to listbox_jira.Count-1 do //alle ID Einträge aus der Listbox nacheinander abarbeiten
         begin
           startpos := Pos (listbox_jira.Items[y], s);
           if (startpos > 0) then
             begin
               //Match in die Liste eintragen
               Listbox1.Items.Add('JIRA: '+listbox_jira.Items[y]+' entspricht IR: '+rnid);
             end
             else
             begin
               //nix eintragen
             end;
         end;
    end;
  end;
  // Die Zahl der gefundenen EInträge in Label1 anzeigen...
  if ListBox1.Items.Count > 0 then
    label1.Caption := IntToStr(ListBox1.Items.Count) +
      ' Einträge verglichen'
  else
    label1.Caption := 'Keine IRs gefunden.';
end;
Das Ergebnis ist eigentlich gut: ich erhalte alle 300 IDs und ich vergleiche jede davon mit dem Listbox-Inhalt. Leider wird mein gesuchter Text "abgeschnitten".
In obiger Prozedur sollte der String s aus folgender Zeile bestehen:

Code:
RNID=08399806&amp;noBack=false'); return false" href="javascript:void(0)">08399806</a></td><td>yout title goes here</td><td>New</td><td>Lucky Luke - Online Support</td><td></td><td>Horses are unlucky</td><td>Maria Herbst</td><td>Tomatoes</td><td>16MAY14 07:41</td><td>16MAY14 07:41</td><td>Medium</td><td>
                            No
                   </td><td> </td><td>6653</td><td> </td><td></td>
</tr>
Tatsächlich kommt aber nur folgendes an:

Code:
RNID=08399806&amp;noBack=false'); return false" href="javascript:void(0)">08399806</a></td><td>yout title goes here</td><td>New</td><td>Lucky Luke - Online Support</td><td></td><td>Horses are unlucky</td><td>Maria Herbst</td><td>Tomatoes</td><td>16MAY14 07:41</td><td>16MAY14 07:41</td><td>Medium</td><td>
Gerade der wichtige Teil der versteckten ID wird abgeschnitten und kann somit nicht untersucht werden.

Woran kann den das liegen ? An einem Linefeed ?
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat