![]() |
Memo Feld export nach CSV
Hi,
ich habe ein Memo Feld und würde gerne den Inhalt exportieren zu einer CSV Datei, wie kann ich das machen ? Gruß |
AW: Memo Feld export nach CSV
Mit so einem Minimalset an Informationen kann die Antwort nur lauten:
Code:
.SaveToFile()
|
AW: Memo Feld export nach CSV
Hi
ich habe in einem Memo Feld einen Text stehen darin auch eine Tabelle diese will ich gerne auslesen und als Excel csv speichern . Im Memo Feld beginnt die Tabelle bei dem Wort begin Und hört auf bei Ende , den zwischen Text würde ich gerne kopieren und dann als csv speichern Der Text im Memo ist in etwa so aufgebaut Bla blubb usw Bla Test ........ begin Name Straße PLZ usw Name1 Strauss plz1 usw ..... ..... Ende So sieht es in etwa aus |
AW: Memo Feld export nach CSV
Hallo...
da wirst du um selbst parsen und in Datei ablegen nicht herumkommmen... PS: Ist das Memo für diese Art der Datenhaltung nicht denkbar ungeeignet ? Kannst du mal die Gründe für die Verwendung darlegen ? |
AW: Memo Feld export nach CSV
Hi,
also ich lese aus einer Webseite den Text aus und packe diesen in ein Memo und von dort aus werte ich die werte aus.. falls es eine einfachere Möglichkeit gibt, wäre ich sehr interessiert daran.. Also ich habe einen Button der mir den Html Outertext kopiert und mir dann halt in ein Memo einfügt und dann wollte ich jetzt gerne den herauskopierten text auswerten und in eine csv datei schreiben.. Gruß Klaus |
AW: Memo Feld export nach CSV
Ein Memo ist eine GUI-Komponente und dient zur Darstellung von Daten, nicht zur Haltung derselben.
Und ein Button kopiert Dir den den Text sicherlich nicht - das macht höchstens Dein Code, der auf einen Buttonclick reagiert. Und genau dort solltest Du auch ansetzen - was spricht dagegen, die Daten nach dem Herauslesen an einen Parser zu übergeben? Wofür genau brauchst Du das Memo? Und bitte gewöhne Dir eine klare Ausdrucksweise an - das gilt ganz besonders für die Darlegung Deiner Anforderungen und Probleme! |
AW: Memo Feld export nach CSV
Zitat:
also du beginnst am besten mit for i := 0 to Memo1.Lines.Count - 1 do an. Zuerst löscht du den Bereich vor der Tabelle Dann löscht du den Bereich nach der Tabelle Im Block gehst du nun mit Memo1.Lines[i] Zeile für Zeile durch (ich kürze das ab in dem ich die Zeile als s Bezeichne) Den s String bearbeitest du mit for k := 1 to Length(s) Am Anfang s fügst du ein " Anführungszeichen Zeichen ein Weiterhin suchst du in s nach Tab-Zeichen, die ersetzt du mit "," (Anführungszeichen Komma Anführungszeichen) Ans Ende s fügst du du ein " Anführungszeichen Zeichen ein Das Alles Zeile für Zeile Das alles dann mit Memo1.Lines.SaveToFile(c:\date.csv'); speichern |
AW: Memo Feld export nach CSV
Zitat:
Aber solange Klaus sich da in Schweigen hüllt und wir bestenfalls nur häppchenweise Informationen bekommen ist das alles nur Spekulation. |
AW: Memo Feld export nach CSV
hi
ich glaub ich habe noch ein Problem.. ich müßte glaub ich erstmal richtig parsen.. Hat jemand da eine Idee wie ich z.B. in einer Webseite ein Table auslesen kann, vielleicht geht es ja doch einfacher als über in memo. |
AW: Memo Feld export nach CSV
Zitat:
Ich glaube, Du meinst etwas ganz anderes. Aber Du scheinst nicht in der Lage oder Willens zu sein, Deine Problemstellung genau und vollständig(!) zu formulieren. |
AW: Memo Feld export nach CSV
Zitat:
Nur während hier Antworten kommen, ist deine einzige Reaktion drauf deine Frage zu wiederholen zu wiederholen zu wiederholen, statt drauf einzugehen. Ein Tipp: wenn du nicht programmieren willst, dann nimm Excel. Der konvertiert für dich :shock: |
AW: Memo Feld export nach CSV
Hi Popov deinen Tipp finde ich super..
habe heute mal nen bisschen rum probiert.. ich habe jetzt ne super idee rausgefunden.. bzw. gegoogelt. Also ich habe eine Webseite da muß ich auf eine Tabelle die sich im HTML Text befindet. und pro Seite habe ich 50 Auftragsdaten untereinander geglidert, gesamt ca. 1500 Aufträge Seite ist so ca. aufgebaut.. 1-50, 51-100, 101-150, 151-200.... usw. bis 1451-1500 (Das sind jeweils Links zu den 50er Blöcken Aufträgen! Der Aufbau ist wie bereits schon geschrieben.. ca so aufgebaut Webseiten beschreibung bla blub blub bla und dann kommen die Aufträge Auftragsnummer - Status - KD Name - Anschrift usw. 12313 offen Günther Anschrift 34424 bearbeitet Klaus Anschrifts usw. so jetzt habe ich im Netz folgenden Code gefunden und etwas angepaßt auf meine wünsche.. Code:
Delphi-Quellcode:
In den Edit Feldern stehen die Werte um auf die Tabelle zu kommen, die Tabelle der HTML Seite.. Bei meiner mußte ich nur die Tabellen Nummer von 6 auf 5 stellen der Rest also die "TD" und "TH" Kennzeichnungen sind geblieben..
procedure TForm1.Button13Click(Sender: TObject);
var aNode,aNode2 : Olevariant; r,c,z,z2 : Integer; begin //item(6) = 7te Tabelle in der Webseite // aNode := WebBrowser1.OleObject.Document.all.tags('table').Item(7); aNode := WebBrowser1.OleObject.Document.all.tags(Edit8.text).Item(StrToInt(edit9.text)); // r := aNode.all.tags('tr').Length;//Zeilen feststellen r := aNode.all.tags(Edit10.text).Length;//Zeilen feststellen StringGrid1.RowCount := r; for z := 0 to r-1 do begin // aNode2 := aNode.all.tags('tr').Item(z); aNode2 := aNode.all.tags(Edit11.text).Item(z); // c := aNode2.all.tags('th').Length; c := aNode2.all.tags(Edit12.text).Length; if c > 0 then begin if c > StringGrid1.ColCount then StringGrid1.ColCount := c; for z2 := 0 to c-1 do // StringGrid1.Cells[z2,z] := aNode2.all.tags('th').Item(z2).innerText; StringGrid1.Cells[z2,z] := aNode2.all.tags(Edit13.text).Item(z2).innerText; end; // c := aNode2.all.tags('td').Length; c := aNode2.all.tags(Edit14.text).Length; if c > 0 then begin if c > StringGrid1.ColCount then StringGrid1.ColCount := c; for z2 := 0 to c-1 do // StringGrid1.Cells[z2,z] := aNode2.all.tags('td').Item(z2).innerText; StringGrid1.Cells[z2,z] := aNode2.all.tags(Edit15.text).Item(z2).innerText; end; end; end; Nun das funktioniert schonmal super.. Popov deine Idee ist auch super aber ich stoße damit an ein weiteres Problem was ich nicht bedacht hatte... unswar. Jetzt habe ich die Werte ausgelesen im Memo.textfeld und die stehen wie folgt dort Auftragsnummer-Status-KD Name-Anschriftusw. 12313offenGüntherAnschrift 3442bearbeitetKlausAnschrifts statt mit leerzeichen so Auftragsnummer - Status - KD Name - Anschrift usw. 12313 offen Günther Anschrift 34424 bearbeitet Klaus Anschrifts usw. .. Und dieses würde bei der weiterverarbeitung dann für mich zu neuen Problemen führen.. :-( Aber ich bin echt Dankbar für deine Tipps hast mir bereits bei einem anderem Problem super super gut weitergeholfen.. Nun jetzt habe ich aber auch wieder ein weiteres Problem.. Wie kann ich mit dem oben stehenden Code für das Parsen in ein Stringgrid erreichen, das er mir zeilen unten dran hängt. Weil wenn ich jetzt die 50 Seiten schritte durch gehe und immer Button13 drücke parster er mir nur den aktuellen wert, logisch und hängt die daten nicht hinter die vorhandenen Werte.. ähnlich wie beim Memofeld schreibe ich memo2.Text:=WebBrowser1.OleObject.document.body.ou tertext; dann schreibt er es ins memo, wiederhole ich es überschreibt er mir das memo2 feld Mit folgendem hängt er einfach hinten dran die folgenden Werte. Memo2.Lines.Append(WebBrowser1.OleObject.document. body.innerText); Das würde ich gerne jetzt im Stringgrid mit meinem Code aus Button13 auch erreichen.. Hat jemand eine idee ? Und mein zweites Problem wie bekomme ich die Werte vom StringGrid nach Excel ? Ohh jee ich hoffe habe alles verständlich erklären können.. Manchmal ist das wirklich blöd eigentlich einfache Dinge zu erklären.. Hoffe es ist aber halbwegs gut verständlich. Gruß |
AW: Memo Feld export nach CSV
Und wie kommen die Daten von dem Stringgrid ins Memo? Und warum erst noch ns memo kopieren, wenn sie doch schon schön getrennt in den Zellen des Stringgrids stehen?
|
AW: Memo Feld export nach CSV
Hi Luckie,
habe jetzt die Daten nicht mehr in das Memo Feld einfügen lassen sondern direkt in das StringGrid und von dort aus wird es weiterverarbeitet.. Mit der Memo Variante.. würde es auch gehen.. allerdings müßte man die Werte dann über Pos / PosEx etc. sich dann zurecht gestalten.. Das war meine erste idee.. aber über stringgrid übernimmt er ja direkt aus der Webseite die Tabellen Daten und Struktur und gibt mir diese dann in Excel aus.. Habe übrigens gerade einen code im Netz gefunden mit dem man einen Stringgrid nach Excel exportieren kann..
Delphi-Quellcode:
Jetzt bleibt nur das Problem noch mit dem Dateneinfügen in das Stringgrid, wenn ich es über den Code aus Button13 mache überschreibt er mir immer die aktuellen Werte, als Sie hinten dran zu hängen.. vielleicht hat jemand eine Idee für mich ?
procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string); var L: Word; const {$J+} CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); {$J-} begin L := Length(AValue); CXlsLabel[1] := 8 + L; CXlsLabel[2] := ARow; CXlsLabel[3] := ACol; CXlsLabel[5] := L; XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); XlsStream.WriteBuffer(Pointer(AValue)^, L); end; function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean; const {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); var FStream: TFileStream; I, J: Integer; begin Result := False; FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to AGrid.ColCount - 1 do for j := 0 to AGrid.RowCount - 1 do XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if SaveAsExcelFile(StringGrid1, 'c:\MyExcelFile.xls') then ShowMessage('StringGrid saved!'); end; |
AW: Memo Feld export nach CSV
Zitat:
Wenn ich in "Deinem" Code schon die Benennung der Buttons und Edit-Felder sehe, rollen sich mir die Fußnägel auf. |
AW: Memo Feld export nach CSV
Zitat:
|
AW: Memo Feld export nach CSV
Hi,
die Edit felder habe ich eingefügt, damit ich ausprobieren kann und somit herausfinden kann, welche Werte mich zum gewünschten ergebnis bringen. Nicht um das später in das fertige Tool einzufügen. Denn sonst muß ich mich immer wieder einloggen und durch die Webseite klicken und neu starten und so kann ich über die Edit Felder bestimmte werte eintragen und somit ausprobieren am laufenden Prozess wie ich meine End Werte rausfinde. Später sieht das ganze dann komplett ohne edit Felder im Source aus. |
AW: Memo Feld export nach CSV
Delphi-Quellcode:
So hier das ganze mal in schön ;-)
procedure TForm1.ExportFunktion13Click(Sender: TObject);
var aNode,aNode2 : Olevariant; r,c,z,z2 : Integer; begin aNode := WebBrowser1.OleObject.Document.all.tags('intraLC').Item(5); r := aNode.all.tags('tr').Length;//Zeilen feststellen StringGrid1.RowCount := r; for z := 0 to r-1 do begin aNode2 := aNode.all.tags('tr').Item(z); c := aNode2.all.tags('th').Length; if c > 0 then begin if c > StringGrid1.ColCount then StringGrid1.ColCount := c; for z2 := 0 to c-1 do StringGrid1.Cells[z2,z] := aNode2.all.tags('th').Item(z2).innerText; end; c := aNode2.all.tags('td').Length; if c > 0 then begin if c > StringGrid1.ColCount then StringGrid1.ColCount := c; for z2 := 0 to c-1 do StringGrid1.Cells[z2,z] := aNode2.all.tags('td').Item(z2).innerText; end; end; end; |
AW: Memo Feld export nach CSV
ja das stimmt soweit funktioniert es ja auch nur, jedesmal wenn ich den Button13 drücke überschreibt er mir die Stringgrid1 tabelle. Nur ich müßte es irgendwie hinbekommen das wenn ich 13 drücke. die jeweiligen datensätze angehängt werden
also sagen wir in der webseite steht html seite 1, 50 datensätze in der tabelle bla .... bla .... bla .... bla .... bla .... bis zur 50. stelle. nun wenn ich die webseiten nach einander abklicke und dann jeweils die 13 drücke überschreibt er mir die werte anstatt diese hinter die vorhandenen werte zu setzen in der stringgrid. das ist mein kleines Problemchen. |
AW: Memo Feld export nach CSV
Merk dir die letzte gefüllte Zeile im StringGrid.
|
AW: Memo Feld export nach CSV
@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; |
AW: Memo Feld export nach CSV
hi Popov,
ich glaube das ist echt genial.. ich muß nachher nur mal das an meine seite angleichen.. Cool Danke.. Hast du vielleicht auch eine idee das andere Problem zu lösen mit dem StringGrid, weil ich das auch gut gebrauchen kann.. Dort bekomme ich es leider nicht hin das er Datensätze an das Stringgrid übergibt und dann hintereinander einfügt.. der überschreibt mir immer bei ausführen das stringgrid.. habe schon einiges versucht.. ich glaube es liegt am
Delphi-Quellcode:
Daran StringGrid1.RowCount := r;
aNode := WebBrowser1.OleObject.Document.all.tags(Edit8.text).Item(StrToInt(edit9.text));
// r := aNode.all.tags('tr').Length;//Zeilen feststellen r := aNode.all.tags(Edit10.text).Length;//Zeilen feststellen StringGrid1.RowCount := r; for z := 0 to r-1 do begin wenn ich stringGrid1.RowCount := StringGrid1.RowCount +1; mache würde er es glaub ich als letzte stelle im grid anhängen kann aber dann nicht die " r := aNode.all.tags(Edit10.text).Length;//" mit einfügen auch " StringGrid1.RowCount := r + 1;" funktioniert leider nicht :( |
AW: Memo Feld export nach CSV
Zitat:
Wenn da nur nicht so viele Konjunktive bei Dir wären... |
AW: Memo Feld export nach CSV
Wenn du ein Stringgrid verwendest und die Daten in eine CSV Datei speichern magst, kannst du auch mal
![]() |
AW: Memo Feld export nach CSV
Hi
Vielen Dank, das mit der csv ist ja genial.. Kann ich auch gut gebrauchen . Dankeschön |
AW: Memo Feld export nach CSV
An popov's Lösung ist die direkte Übergabe an das Memo, der Schwachpunkt. Benutze hier lieber eine Stringlist, von dort aus ist das Befüllen eines Stringgrids und/oder einenes Memos eigentlich kein Problem.
Auch wenn vagtler ein wenig unfreundlich war, in der Sache hat er durchaus recht. Überleg Dir was Du willst und versuch es so zu formulieren, daß geistig etwas zurück gebliebene Menschen es verstehen. Dann ist es für Dich auch einfacher an die Lösung zukommen. Gruß K-H |
AW: Memo Feld export nach CSV
Zitat:
|
AW: Memo Feld export nach CSV
mir ging's nur darum, die Datenhaltung im Memo zu unterbinden,
das ist ja nicht nur eine Frage des Stils sondern auch der Datenintegrität. (der Schwachpunkt war nicht pers. gemeint!) Gruß K-H |
AW: Memo Feld export nach CSV
Hab es auch nicht so verstanden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz