Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#21

AW: Memo Feld export nach CSV

  Alt 26. Feb 2012, 15:58
@Klaus

Ich habe dich zwar falsch verstanden, ich dachte du meinst nicht den Quelltext, sondern den Inhalt einer Webseite. Da ist das Auslesen der Tabellen eine Kleinigkeit, aber Tabelle aus dem Quelltext ist auch nicht problematisch:

In Memo1 ist der Quelltext, in Memo2 ist die Csv-Tabelle. Zu beachten ist, es wird die erste Tabelle konvertiert.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s, sTemp: String;
  i, p1, p2: Integer;
begin
  s := Memo1.Lines.Text;

  //Vorsicht! Möglich Fehlerquelle Klein/Großschreibung der Tags
  //Zuerst ERSTE Tabelle suchen und auschneiden
  p1 := Pos('<table', s);
  p2 := Pos('</table', s);

  if p1 = 0 then
  begin
    MessageDlg('Tabelle nicht gefunden', mtInformation, [mbOk], 0);
    Exit;
  end;

  s := Copy(s, p1, p2 - p1); //Kopiert Bereich zwischen table-Tags
  p1 := Pos('>', s);
  s := Copy(s, p1 + 1, MaxInt); //Entfert <table ... > am Anfang

  //Zelle-Tags gegen Anführungzeichen ersetzten
  s := StringReplace(s, '<th>', '"', [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, '</th>', '",', [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, '<td>', '"', [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, '</td>', '",', [rfReplaceAll, rfIgnoreCase]);
  //Zeilen entfernen
  s := StringReplace(s, #13, '', [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, #10, '', [rfReplaceAll, rfIgnoreCase]);

  while Pos('</tr', s) > 0 do
  begin
    p1 := Pos('"', s); //sucht anfang erste Zelle
    p2 := Pos('</tr', s); //sucht ende letzte Zelle
    sTemp := Copy(s, p1, p2 - p1); //Kopiert Tabellensatz in sTemp
    Delete(s, 1, p2); //Löscht Tabellensatz in s

    Memo2.Lines.Add(sTemp); //Übergibt Tabellensatz am Memo2
  end;

  //Zueletzt aufräumen. Letztes Komma ist zuviel
  s := Memo2.Lines.Text;
  s := StringReplace(s, ',' + #13#10, #13#10, [rfReplaceAll]);
  Memo2.Lines.Text := s;
end;
  Mit Zitat antworten Zitat