Dateistream "abfangen"

#3113604
Lesenswert?

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
Persönliche Seite #3113609
Lesenswert?

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.
#3113634
Lesenswert?

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
#3113650
Lesenswert?

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
#3113664
Lesenswert?

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
#3113705
Lesenswert?

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)?
Persönliche Seite #3113714
Lesenswert?

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.
Gast #3113727
Lesenswert?

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.
#3113842
Lesenswert?

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.
Gast #3114432
Lesenswert?

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.
#3117324
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren