Hallo, Ich hab im Moment ein Tool, was mir Daten in eine CSV Datei schreibt. Das macht es wohl kontinuierlich, da die Datei stätig größer wird. Leider habe ich keinen Zugriff auf den Quellcode von dem Programm. Jetzt hab ich mich gefragt ob es möglich ist, diesen Stream in die Datei irgendwie abzufangen um die Daten gleich weiter verwenden zu können? Kennt da vielleicht jemand passende Stichworte oder kann mir gleich weiterhelfen? Programmiersprache währe erst mal egal, da es nur für einen ersten Test dienen soll(ausgeschlossen brainf*** und whitespace :P). Wenn dieses Abfangen nicht möglich ist wäre meine nächste Idee die CSV Datei auszulesen. Hier weiß ich allerdings nicht, ob dies möglich ist während auf sie zu gegriffen wird bzw auf sie geschrieben wird. Optimal wäre es natürlich wenn ich die Daten (fast) live aus der CSV ziehen könnte. Auch hier wieder hat jemand Stichpunkte die mir in dem Thema weiter helfen? bzw kann mir jemand weiterhelfen? oder sind die Ideen eh völliger Käse? Viele Grüße Jan
Jan L. schrieb: > Hier weiß ich allerdings nicht, ob dies möglich ist während auf sie zu > gegriffen wird bzw auf sie geschrieben wird. Ausprobieren. Programm laufen lassen, Notepad aufrufen und Datei öffnen. Programme wie Excel (die sich gerne standardmäßig mit CSV-Dateien verknüpfen) blockieren die geöffnete Datei, so daß das erzeugende Programm das nicht mehr kann. Notepad ist hier zurückhaltender. Ein weiterer Test: Lässt sich die CSV-Datei im Betrieb löschen? Wenn ja, wird mit dem nächsten Schreibzugriff des erzeugenden Programmes gleich eine neue angelegt? Dann bist Du aus dem Schneider.
Mit less kannst Du eine Datei anzeigen, in die geschrieben wird. Ein grosses F schaltet dann ein, dass alle neuen Daten sofort angezeigt werden. fonsana
Jan L. schrieb: > Ich hab im Moment ein Tool, was mir Daten in eine CSV Datei schreibt. > Das macht es wohl kontinuierlich, da die Datei stätig größer wird. > Leider habe ich keinen Zugriff auf den Quellcode von dem Programm. Jetzt > hab ich mich gefragt ob es möglich ist, diesen Stream in die Datei > irgendwie abzufangen um die Daten gleich weiter verwenden zu können? Arbeitest Du unter Linux? Da habe ich (vor Jahren) ähnliche Dinge mit dem LD_PRELOAD-Mechanismus gemacht: einmal habe ich Audio-Streams vom Real-Player ins Audio-Device abgegriffen und direkt auf die Platte gebannt bzw. scp-Verbindungen in ihrer Bandbreite beschränkt. Für letzteres hatte ich den Sourcecode mal "veröffentlicht": http://www.home.unix-ag.org/simon/files/bandwidth.tar.gz Ist bestimmt etwas vor sich hin gebitrotted, aber das Prinzip sollte so gehen. Viele Grüße, Simon
Also erster Test. C++ Stört es nicht, wenn ich zb die TXT Datei mit Notepad offenhabe. Er list Trotzdem alles, was beim Zeitpunkt des Ausführens gespeichert ist. hab das einfach irgendwo rauskopiert
1 | #include <fstream> |
2 | #include <iostream> |
3 | using namespace std; |
4 | |
5 | int main(int argc, char *argv[]) |
6 | { |
7 | fstream f; |
8 | char cstring[256]; |
9 | f.open("testDatei.txt", ios::in); |
10 | while (!f.eof()) |
11 | { |
12 | f.getline(cstring, sizeof(cstring)); |
13 | cout << cstring << endl; |
14 | } |
15 | f.close(); |
16 | system("pause"); |
17 | } |
und zu den tests, Löschen kann ich die Datei leider nicht, da auf sie zugegriffen wird... öffnen kann ich sie allerdings, doch dann bekomm ich den Stand den die Datei beim öffnen hatte. Leider arbeite ich mit Windows. Allerdings werde ich dann mal überlegen (vorrausgesetzt ich bekomms hin) mal Linux zu installieren bzw ne VM zu erstellen
Simon Budig schrieb: > Ist bestimmt etwas vor sich hin gebitrotted, Sorry, ist was? Nicht mal Google kennt dieses Wort...
troll schrieb: > Simon Budig schrieb: >> Ist bestimmt etwas vor sich hin gebitrotted, > Sorry, ist was? Nicht mal Google kennt dieses Wort... Pardon. "bitrot" bezeichnet das langsame Veralten von Code, den man seit Jahren nicht mehr angeguckt hat und der aus komischen Gründen (neue Compiler etc.) jetzt nicht mehr Stand der Technik ist bzw. "neue" Bugs enthält. "gebitrotted" ist eine schlecht eingedeutschte Beschreibung für dieses Geschehen :) Viele Grüße, Simon
also ich hatte jetzt eine Idee an deren Umsetzung ich grade sitze. Ich dachte mir (auch wenn es geschwindigkteistechnisch bestimmt sehr schlecht ist) das in etwa so zu machen:
1 | while (1) |
2 | { |
3 | if (f.getline(cstring, sizeof(cstring))!=NULL){ |
4 | cout << cstring << endl; |
5 | }else{ |
6 | f.close(); |
7 | f.open("testDatei.txt", ios::in); |
8 | } |
9 | } |
Heißt einfach, vorerst pack ich alles in eine Endlosschleife. da prüfe ich dann ob die nächste Zeile noch Inhalt hat (es gibt keine leeren Zeilen in meiner Datei) diese gibt er dann aus. Findet er keine Zeile mehr schließt er die Datei und öffnet sie neu. An sich ist das auch erst mal ganz ok. Allerdings müsste ich die gelesenen Zeilen direkt rauslöschen, da er mir diese im Moment wieder Ausdruck( + die neu hinzugekommenen) wie allerdings lösche ich die gelesene Zeile (vielleicht sogar performant)?
Hallo, unter Linux würde ich "tail -f <Dateiname>" vorschlagen. Damit wird continuierlich das Dateiende überwacht und neu hinzugekommene Zeilen angezeigt. tail ist auch Teil von Mingw (msys). Vieleicht hilft Dir das weiter...
Jan L. schrieb: > Allerdings müsste ich die > gelesenen Zeilen direkt rauslöschen, da er mir diese im Moment wieder > Ausdruck( + die neu hinzugekommenen) wie allerdings lösche ich die > gelesene Zeile (vielleicht sogar performant)? Falscher bzw. äußerst ungünstiger Ansatz. Wenn es möglich ist, dem CSV-Erzeuger-Programm hinterrücks die erzeugte Datei zu entwenden (hast Du das mittlerweile mal ausprobiert?), dann kannst Du die Datei zyklisch umbenennen, die umbenannte Datei in aller Gemütsruhe einmal auswerten und dann löschen.
ahh also tail klappt auch super unter windows. jetzt muss ich nurmal schaun wie ich das am besten integrier bzw sinvoll nutzen kann
Hallo, du wirst die Zeilen nicht aus der Datei löschen können, da das andere Programm ja auch schreibend auf die Datei zugreift. Du könntest dir höchstens merken, bis zu welcher Position du die Datei bisher ausgelesen hast und nach dem erneuten öffnen der Datei nur die Zeichen ausgeben, die danach hinzugekommen sind. Grüße, Florian
schau dir doch einfach mal den quelltext von tail an. Oder teste mal ohne die Datei neu zu öffnet einfach mal ans Ende zu springen seek mit passenden paramter. Eventuell kannst du damit immer die akuelle größe abfragen. (keien Ahnung wie man das mit C++ macht, für soetwas nehme ich die Ansi funktionen). seek liefert dir dann den absoluten offset zurück. Die differenz zum vorherigen ist dann das was neu dazugekommen ist.
soooo... Das war zwar jetzt mehr probieren wie können aber ich hab es soweit hinbekommen. es sieht jetzt folgendermaßen aus:
1 | while (1) |
2 | { |
3 | if (f.getline(cstring, sizeof(cstring))!=NULL){ |
4 | cout << cstring << endl; |
5 | posg = f.tellg(); |
6 | |
7 | }else{ |
8 | f.close(); |
9 | f.open("C:\\Debug2013.4.3_15.54.24.csv", ios::in); |
10 | f.seekg(posg, ios::beg); |
11 | } |
12 | } |
ich merk mir einfach die position die ich grade gelesen habe. und wenn ich die datei neu öffne springe ich genau an diese Position. Ich muss es nur noch testen, was bei der Menge an Daten im Moment noch recht schwer ist -> weil Unübersichtlichch. Das Ergebnis gefällt mir zwar überhaupt nicht, da das mein Rechner performance mäßig kein Stück mit macht (er hat schon genug damit zu tun die Daten die mit ca. 70Hz kommen in die CSV zu schreiben) aber es ist ein Ergebnis. Als nächstes werde ich wohl die Daten eher in einen Buffer schreiben schreiben um wenigstens mit der Ausgabe ein bisschen Zeit zu haben.
Jan L. schrieb: > Das Ergebnis gefällt mir zwar überhaupt nicht, da das mein Rechner > performance mäßig kein Stück mit macht (er hat schon genug damit zu tun > die Daten die mit ca. 70Hz kommen in die CSV zu schreiben) aber es ist > ein Ergebnis. was erwartest du von einer schleife ohne wartezeit? Damit lastet du jedes System zu 100% aus?. Eventuell sollte man ein paar ms immer mal warten. Auch mal ohne neu zu öffnen probieren, das kostet bloss sinnlos zeit.
Vielleicht kann man dem Tool auch eine named pipe anstelle der CSV-Datei unterschieben. Was sagen die Windows-Kenner dazu? http://en.wikipedia.org/wiki/Named_pipe
Das wäre der elegant Ansatz. Das Pipe-Filessystem ist genau dafür gemacht.
BTW, geht auch über (Windows-)Rechner Grenzen hinweg. //Rechner/Pipe Programmieren über Windows-API oder .NET
Win schrieb: > BTW, geht auch über (Windows-)Rechner Grenzen hinweg. > //Rechner/Pipe > Programmieren über Windows-API oder .NET eher: \\.\PIPE\PipeName http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx Falls das nicht klappt wäre ggf. auch eine RAMDisk eine Option. Eine Ramdist ist wesentlich schneller, und RAM sollte heute genug vorhanden sein... mfg Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.