(Gast)
n/a Beiträge
|
AW: Memo Feld export nach CSV
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;
|