Daten aus string Spaltenweise in Textdatei speichern



  • @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @hustbaer sagte in Daten aus string Spaltenweise in Textdatei speichern:

    D.h. die einzige Möglichkeit das zu machen wäre das File komplett neu zu schreiben. D.h. du müsstest z.B. das alte File zeilenweise lesen, dann im Speicher an jede gelesene Zeile die gewünschte Spalte anhängen, und die neue Zeile dann wieder in ein 2. File rausschreiben. Und dann, wenn du alle Zeilen durch hast, das 2. File über das 1. drüberkopieren. Dauert lange das zu programmieren und ist auch nicht sonderlich performant in der Ausfürhung. Macht man nicht wenn man nicht muss.

    Also warum du mit 2 Files agierst und das so umständlich machst versteh ich nicht oder sollte das zur einfacheren Erklärung sein? Denn der einfachste Weg ist doch das File Zeilenweise bis zum Zeilenumbruch in einen String zu lesen: Dann packt man die neue "Spalte" hinten an

    Die neue Spalte steht aber erst ein paar Zeilen weiter in der Datei.


  • Mod

    @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Also warum du mit 2 Files agierst und das so umständlich machst versteh ich nicht oder sollte das zur einfacheren Erklärung sein? Denn der einfachste Weg ist doch das File Zeilenweise bis zum Zeilenumbruch in einen String zu lesen: Dann packt man die neue "Spalte" hinten an und den Zeilenumbruch. Das ganze jetzt für jede Zeile wiederholen und wenn man alle Zeilen durch hat, dann das ganze in die gleiche Datei wieder schreiben. Fertig ist das ganze, kein Zauberwerk und keine großartige Sache.

    Zwischendurch lagerst du die ganze Datei, egal wie groß, im Speicher zwischen? Wenn beim Schreiben etwas schief geht, sind die Ursprungsdaten unwiederbringlich futsch? Und das, um einen einzigen Move am Ende zu sparen?

    Du schätzt falsch ein, wo die Unterschiede liegen und was sie bedeuten. Als Faustregel sind Streamingalgorithmen eigentlich immer besser, wenn sie in Frage kommen.


  • Mod

    Noch ein Nachtrag: Der Grund, warum das nicht geht, ist ja, dass Dateien ein diffuser Zeichenstrom sind, mit einem Anfang, einer Stelle an der man gerade ist, und einer Möglichkeit das Ende zu erkennen. Da kann man also nichts einfügen, sondern nur anhängen oder ändern. Das ist der kleinste Nenner dessen, was man so allgemein als Datei bezeichnet.

    Aber das stimmt ja nicht für alles was man so als Datei bezeichnet. Denn zumindest wenn die Datei physisch auf einem Blockgerät gespeichert ist (also das, was die meisten Nicht-Informatiker unter einer "Computerdatei" verstehen würden), dann besteht die Datei aus klar nummerierten Blöcken in einer bestimmten Reihenfolge. Und da könnte man auch weitere Blöcke mitten drin einfügen. Das ist aber Sache des Dateisystems, an dem man normalerweise tunlichst nicht herumschrauben sollte, und weshalb die Dateienschnittstelle eines Betriebssystems und die darauf aufbauende C++-Dateienschnittstelle einen nicht daran lassen.

    Ich dachte, das wäre alles, aber der Neugierde habe ich noch einmal geguckt, und siehe da: Linux (und zwar nur Linux, nicht allgemeines Posix!) hat tatsächlich einen Systemcall, um (Block-)Dateien auf Blockebene zu manipulieren. Das heißt, man kann tatsächlich Blöcke in der Mitte einfügen oder entfernen. Für Windows hatte ich nicht die Energie, das auch noch zu recherchieren.

    Das ist in diesem speziellen Fall so natürlich nutzlos. Ein Block hat eine feste Größe, die vom Dateisystem (oder gar der Hardware) fest vorgegeben ist, und man kann daher nur an den Grenzen dieser Blöcke etwas einfügen oder entfernen, und das Eingefügte und Entfernte hat dann exakt die Blockgröße. Was halt seltenst exakt mit den Ansprüchen für die Spalten zusammenfallen wird. Aber wenn unbedingt ein Dateiformat benötigt, das Einfügen oder Löschen in der Mitte erlauben soll, dann kann man so etwas tatsächlich aufziehen, wenn man diese Beschränkungen im Hinterkopf behält. Das könnte zum Beispiel ganz nützlich sein, wenn man ein Datenbanksystem schreiben möchte.



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Also warum du mit 2 Files agierst und das so umständlich machst versteh ich nicht oder sollte das zur einfacheren Erklärung sein? Denn der einfachste Weg ist doch das File Zeilenweise bis zum Zeilenumbruch in einen String zu lesen: Dann packt man die neue "Spalte" hinten an und den Zeilenumbruch. Das ganze jetzt für jede Zeile wiederholen und wenn man alle Zeilen durch hat, dann das ganze in die gleiche Datei wieder schreiben. Fertig ist das ganze, kein Zauberwerk und keine großartige Sache.

    Zwischendurch lagerst du die ganze Datei, egal wie groß, im Speicher zwischen? Wenn beim Schreiben etwas schief geht, sind die Ursprungsdaten unwiederbringlich futsch? Und das, um einen einzigen Move am Ende zu sparen?

    Du schätzt falsch ein, wo die Unterschiede liegen und was sie bedeuten. Als Faustregel sind Streamingalgorithmen eigentlich immer besser, wenn sie in Frage kommen.

    Wieso sollte ich das falsch einschätzen? Ich bin nicht davon ausgegangen das ich explizit auch noch darauf hinweisen muss das man die alte Datei vorher als .bak umbenennen kann/sollte bevor man die neue Datei schreibt. Das sollte doch jeder für sich selbst entscheiden können.

    Mit zum Schluss 3 Dateien rum zu frickeln macht die ganze Sache sicher auch nicht Sicherer und klar kann man seine Daten als Stream raus schreiben. Möglichst noch die Rohdaten einfach hintereinander, eine Version der einzelnen Dateistände ist dann auch nicht mehr drin. Aber das auseinander zu nehmen würde den Rahmen hier sprängen und auch weit vom eigentlichen Thema ab kommen. Denn Möglichkeiten gibt es viele zum Ziel zu kommen, nur ist immer die Frage in wieweit der TO das versteht.


  • Mod

    @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Mit zum Schluss 3 Dateien rum zu frickeln macht die ganze Sache sicher auch nicht Sicherer

    Wieso sollte ich das falsch einschätzen?

    Weil du nicht einmal korrekt bis 3 zählen kannst…



  • @CTecS

    Ich bin nicht davon ausgegangen das ich explizit auch noch darauf hinweisen muss das man die alte Datei vorher als .bak umbenennen kann/sollte bevor man die neue Datei schreibt.

    Darum geht es nicht. Lies den Text von SeppJ noch einmal.

    Wenn dein Programm (oder der Computer) mittendrin abstürzt, hinterlässt dein Programm eine fehlerhafte Datei. Bei SeppJ ist das nicht der Fall.



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Weil du nicht einmal korrekt bis 3 zählen kannst…

    aber ich troll ^^



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Mit zum Schluss 3 Dateien rum zu frickeln macht die ganze Sache sicher auch nicht Sicherer

    Wieso sollte ich das falsch einschätzen?

    Weil du nicht einmal korrekt bis 3 zählen kannst…

    Schade das du dich auf so ein Niveau begibst, im allgemeinen dachte ich das hier über Probleme diskutiert wird aber hier darf sich der Mod ausdrücken wie er mag, solange es nicht der schnöde Forenteilnehmer macht, ich dachte ich hatte da mal irgend wo was von Etikette gelesen

    @wob sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @CTecS

    Ich bin nicht davon ausgegangen das ich explizit auch noch darauf hinweisen muss das man die alte Datei vorher als .bak umbenennen kann/sollte bevor man die neue Datei schreibt.

    Darum geht es nicht. Lies den Text von SeppJ noch einmal.

    Wenn dein Programm (oder der Computer) mittendrin abstürzt, hinterlässt dein Programm eine fehlerhafte Datei. Bei SeppJ ist das nicht der Fall.

    Ich bin der Meinung das es keinen Unterschied macht, denn wenn er beim schreiben der Zwischendatei ab stürzt ist das Ergebnis das gleiche, das gleiche gilt beim schreiben der Enddatei, denn auch mit der org. Datei und der Zwischendatei kann man nichts anfangen, aber wie gesagt das ist meine Meinung und ihr seit anderer Meinung, das ist legitim.



  • @CTecS Transaktionssicherheit. Undefinierte Zustände nach einem Prozess sind auf jeden Fall zu vermeiden. vgl. Transaktion.



  • @Swordfish sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @CTecS Transaktionssicherheit. Undefinierte Zustände nach einem Prozess sind auf jeden Fall zu vermeiden. vgl. Transaktion.

    Ich versteh schon was du sagen willst, nur was nützt dir das Zwischenergebnis wenn er beim schreiben des Endergebnis nichts raus bring weil er da abgestürzt ist? Genau nichts.

    Bei Software die lange läuft, sollte so und so ein Log-File geschrieben werden, darin sollte man dann auch nachvollziehen können was wie passiert ist. Alternativ kann man sich auch einen Memory-Dump schreiben lassen und den Analysieren. Wie gesagt alles für größer Projekte die 24/7 laufen. Für Sachen die vielleicht nur für einen User sind oder mehrere die aber kurz laufen ist diese Betrachtung eher irrelevant.

    Um das anders zu sagen bei mir würde es keine Undefinierten Zustände geben. Wenn die zu ladente Datei Klarschlag ist dann wird die gelöscht und die bak-Datei dafür benutzt. Wo ist das Problem? Transaktionssicherheit bedeutet nicht automatisch das man jeden schritt in eine Datei schreiben muss.


  • Mod

    Was du vor hast ist so ein typischer Algorithmus von reichen, verwöhnten Einzelkindern: Hat unendlich Geld, alles wird immer klappen, fürchtet keine Konsequenzen, denkt nicht an andere.

    Da du nicht selber darauf kommst, hier ein paar Szenarien:

    Szenario Einzelkind Streamingalgo
    anderer Prozess greift auf Datei zu anderer Prozess bekommt falsche/keine Daten. Problematik ist unlösbar! kein Problem möglich
    anderer Prozess hat Datei gelockt kommt gar nicht zurecht kein Problem, solange es irgendwann released wird
    Platte voll beim Schreiben Braucht Sondercode, der diesen Fehler abfängt, Platz macht, und Ursprungszustand herstellt kein Problem
    anderer Schreibfehler Datenverlust bis separate Wiederherstellung läuft kein Problem
    Name der Backup Datei ist schon belegt Braucht Sondercode, der diesen Fall abfängt. Lösungsansatz unklar kein Problem möglich, Tempdatei wird beim OS bestellt
    Name der Backupdatei ist ungültig Braucht Sondercode, der diesen Fall abfängt. Lösungsansatz unklar kein Problem möglich, Tempdatei wird beim OS bestellt
    Keine Schreibrechte für andere Dateien in Verzeichnis Braucht Sondercode, der diesen Fall abfängt. Lösungsansatz unklar kein Problem möglich, Tempdatei wird beim OS bestellt
    Weitere Race conditions Programmierer muss auf weitere Race Conditions mit den Dateien achten. Diese Probleme sind zwar alle lösbar, aber der Programmierer muss dran denken (Hättest du? Nenn doch mal ein paar!) . Ich habe nur die unlösbaren gelistet. keine Probleme möglich
    Fehler 2. Ordnung, also wenn während Fehlerbehandlung etwas schief geht Katastrophe! Hat ja erst gar keine Probleme
    Arbeitsspeicher voll Braucht Sondercode, um das abzufangen. Was gar nicht so einfach ist, weil das OS vielleicht den Prozess abschießt, wenn zu viel Speicher belegt. Sonst Datenverlust bis separate Wiederherstellung braucht sowieso so gut wie keinen Speicher, aber selbst wenn, kein Problem
    andere abnormale Programmterminierung (externer Kill, Stromausfall, Programmierfehler, etc. ) Datenverlust bis separate Wiederherstellung kein Problem
    Programmierkomplexität braucht Abwägung zwischen Effizienz der Datenstruktur und Speicherbelegung der Datenstruktur. Die ganzen Sonderfehlerabfangcodes gar nicht eingerechnet Die naive Lösung ist schon maximal effizient, Speicherbelegung minimal. Mit etwas mehr Aufwand ist Speicherbelegung beliebig minimierbar. Keine Fehlerbehandlung nötig.
    Prozesskomplexität Braucht weiteren Wiederherstellungsprozess für Fehlerfälle, dessen Einsatz irgendwie koordiniert sein muss Keine
    Anwendbarkeit auf Daten unbekannter Größe, z.B. Devicefiles, Sockets, u.v.a.m. Nein Ja

    Besonders der erste Punkt ist fatal und unlösbar. Ein Prozess der dafür sorgt, dass die Daten für andere Prozesse in einem undefinierten Zustand sind, während er läuft? Absolut unverzeihlich.



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Was du vor hast ist so ein typischer Algorithmus von reichen, verwöhnten Einzelkindern

    Ich stimme dir in den Argumenten der Tablle zu. Aber: das hat NICHTS mit Einzelkindern zu tun. Also bitte hier keine Beleidigungen! Danke.

    Zum ersten Argument noch bei dem "Stramingalgo": "kein Problem möglich" stimmt nicht so ganz, das Problem "liest veraltete bzw. gerade veraltende Daten" ist möglich, sofern nicht mit Locks gearbeitet wird.



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Was du vor hast ist so ein typischer Algorithmus von reichen, verwöhnten Einzelkindern: Hat unendlich Geld, alles wird immer klappen, fürchtet keine Konsequenzen, denkt nicht an andere.

    1. ich hab noch mehr Geschwister, was hier aber nichts zur Sache tut.
    2. Ich verdiene mein Geld schon etliche Jahre selbst. Was dich eigentlich auch nichts an geht.
    3. deine Einschätzungen sind wie schon die ganze Zeit so daneben, das es schon nicht mehr schön ist

    Wie sieht es eigentlich aus, wird hier im allgemeinen der Thread nicht geschlossen von irgendeinen Mod wenn der zu Offline wird? ach ne der der Ständig so komische annahmen hier Preis gibt anstatt beim Thema zu bleiben ist ja selbst Mod. Schade hier wird eben alles wie immer mit zweierlei Maß gesehen.

    Ach so deine tolle Tabelle, du kannst dir selbst beantworten was ich davon halte und wie weit das weg ist vom eigentlichen Thema, ich würde Sagen so weit wie die Erde und die Sonne entfernt ist.


  • Mod

    @wob sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Zum ersten Argument noch bei dem "Stramingalgo": "kein Problem möglich" stimmt nicht so ganz, das Problem "liest veraltete bzw. gerade veraltende Daten" ist möglich, sofern nicht mit Locks gearbeitet wird.

    An welcher Stelle denn? Die alten Daten (die während dieser Zeit aktuell sind) sind die ganze Zeit da, während die neuen erzeugt werden. Wenn die neu erzeugten Daten zu den aktuellen Daten werden, wird atomistisch (aus Sicht es Dateisystems) die Datei umbenannt und man bekommt ohne Unterbrechung die nun aktuellen Daten. Wenn ein anderer Prozess vorher einen Handle auf die alten Daten geholt hat, dann sieht er noch die alten Daten, aber das ist ja normal, dass man den Zustand einer Datei hat, wie sie war, als man den Handle geholt hat.

    Irgendwo auf Dateisystemebene sitzen da natürlich Lock-Strukturen, aber das ist ja dort gelöst, damit wir uns nicht zu kümmern brauchen.



  • @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    An welcher Stelle denn? Die alten Daten (die während dieser Zeit aktuell sind) sind die ganze Zeit da, während die neuen erzeugt werden.

    Genau. Und dann lesen 2 Programme diese Datei. Das eine (das hier beschriebene) ersetzt die Datei. Ein anderes erzeugt damit irgendwas anderes. Und ist das vom anderen Programm erzeute nicht mehr passend - weil von alten Datenstand ausgehend. Daher halte ich "kein Problem möglich" für zu krass. Es sind immer viele Probleme möglich, wenn eine Datei geändert wird. Ich könnte mir z.B. vorstellen, dass die Datei irgendwohin sychronisiert wird. Dann wird irgendwie zurücksynchronisiert und der jetzt fertige neue Stand überschrieben. Was auch immer, viele Probleme sind hier denkbar, die hier gar nicht beachtet werden (und auch nicht müssen). Aber zu denken, man wendet das so an und ist alle anderen Probleme los, ist zu stark.


  • Mod

    Dieser Beitrag wurde gelöscht!

  • Mod

    @wob sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @SeppJ sagte in Daten aus string Spaltenweise in Textdatei speichern:

    An welcher Stelle denn? Die alten Daten (die während dieser Zeit aktuell sind) sind die ganze Zeit da, während die neuen erzeugt werden.

    Genau. Und dann lesen 2 Programme diese Datei. Das eine (das hier beschriebene) ersetzt die Datei. Ein anderes erzeugt damit irgendwas anderes. Und ist das vom anderen Programm erzeute nicht mehr passend - weil von alten Datenstand ausgehend. Daher halte ich "kein Problem möglich" für zu krass.

    Verstehe, worauf du hinaus willst. Ja, wenn mehrere Prozesse Änderungsrechte an der Datei haben, kann es problematisch werden. Ich ändere

    Szenario Einzelkind Streamingalgo
    anderer Prozess hat Datei gelockt kommt gar nicht zurecht kein Problem, solange es irgendwann released wird

    zu

    Szenario Einzelkind Streamingalgo
    anderer Prozess hat Datei gelockt kommt gar nicht zurecht Problematisch, falls anderer Prozess schreibt, sonst kein Problem, solange der Lock denn irgendwann released wird

    Wenn aber ein anderer Prozess eine andere Datei erzeugen möchte auf Grundlage der Daten während der Änderungsphase, ist das kein Problem. Es gibt einen Zeitpunkt X, an dem wird die Tempdatei zur offiziellen Datenquelle. Ab da sind die neuen Daten die richtigen Daten. Wenn da vorher jemand liest und mit den Daten etwas tut, dann hat er korrekt die zu dem Zeitpunkt offiziellen Daten erhalten. Ob unser Spalteneinfügeprozess zu dem Zeitpunkt lief oder nicht ist unerheblich. Das gleiche wäre ja auch passiert, wenn der zweite Prozess 1 Sekunde vor dem Spalteneinfügeprozess gestartet wäre, dann würde sein Ergebnis auch nicht zu den später geänderten Daten passen. Entscheidend ist der Zeitpunkt X, an dem die Tempdatei zur offiziellen Datei wird. Das ist der Moment, ab dem die Zusatzspalten zu den offiziellen Daten werden. Alles, was davor die Daten las, hat korrekte, selbstkonsistente Daten ohne Zusatzspalten bekommen. Das waren zu dieser Zeit auch die korrekten Daten, egal ob irgendwo temporär schon an den neuen Daten gearbeitet wurde oder nicht. Alle Zugriffe danach ergeben die Daten mit den Zusatzspalten, was auch vollkommen korrekt ist.

    Das ist so, als würdest du ein Foto (mit Film) von einem Monitor machen, und während du den Film noch entwickelst, wird die Anzeige auf dem Monitor geändert. Da würdest du ja nicht überrascht sagen, dass auf dem Foto das falsche abgebildet wäre.



  • @CTecS sagte in Daten aus string Spaltenweise in Textdatei speichern:

    @hustbaer sagte in Daten aus string Spaltenweise in Textdatei speichern:

    D.h. die einzige Möglichkeit das zu machen wäre das File komplett neu zu schreiben. D.h. du müsstest z.B. das alte File zeilenweise lesen, dann im Speicher an jede gelesene Zeile die gewünschte Spalte anhängen, und die neue Zeile dann wieder in ein 2. File rausschreiben. Und dann, wenn du alle Zeilen durch hast, das 2. File über das 1. drüberkopieren. Dauert lange das zu programmieren und ist auch nicht sonderlich performant in der Ausfürhung. Macht man nicht wenn man nicht muss.

    Also warum du mit 2 Files agierst und das so umständlich machst versteh ich nicht oder sollte das zur einfacheren Erklärung sein? Denn der einfachste Weg ist doch das File Zeilenweise bis zum Zeilenumbruch in einen String zu lesen: Dann packt man die neue "Spalte" hinten an und den Zeilenumbruch. Das ganze jetzt für jede Zeile wiederholen und wenn man alle Zeilen durch hat, dann das ganze in die gleiche Datei wieder schreiben. Fertig ist das ganze, kein Zauberwerk und keine großartige Sache.

    Ich weiss nicht was an der von mir vorgeschlagenen Variante grossartig umständlicher sein soll. Ich würde sagen das nimmt sich nicht viel. Also abgesehen von den anderen Vorteile, auf die du ja schon hingewiesen wurdest (braucht weniger Speicher, ist sicherer).



  • @hustbaer sagte in Daten aus string Spaltenweise in Textdatei speichern:

    Ich weiss nicht was an der von mir vorgeschlagenen Variante grossartig umständlicher sein soll. Ich würde sagen das nimmt sich nicht viel. Also abgesehen von den anderen Vorteile, auf die du ja schon hingewiesen wurdest (braucht weniger Speicher, ist sicherer).

    Sorry ich wollte dich nicht angreifen, beleidigen, herabsetzen oder sonst was, sondern einfach nur eine andere Möglichkeit darstellen. Das dann natürlich aus einer simplen Datei mit paar Zeichen eine Mega Datei gemacht wird die von mehreren Prozessen gelesen und geschrieben wird und der PC worauf das ganze läuft nur 64kb Ram hat und man deswegen auch noch Speicher sparen muss, das hab ich nicht voraus gesehen. Asche auf mein Haupt. Ich hätte doch warten sollen mit meinem unfähigen Beitrag bis meine Kristallkugel aus der Werkstatt wieder da ist, dann wäre mir dieser Fehler sicherlich nicht passiert.


Anmelden zum Antworten