erwin86
Goto Top

Textdatei auslesen und verarbeiten

Hallo,
Ein Programm schreibt mir unregelmäsig eine Zeile in eine Textdatei. Dabei kommt es vor das diese Zeile aber schon vor einem Tag, bzw einer Stunde in die Textdatei geschrieben worden ist.

Ich würde gerne eine Bat schreiben die die neu geschrieben Zeile (immer die letzte) mit allen anderen Zeilen vergleicht wenn diese schon vorhanden ist soll nichts passieren, wenn diese noch nicht vorhanden ist soll sie in eine andere Textdatei geschrieben werden.

Ist das möglich?

Ist das auch echtzeit möglich? da manchmal mehrere zeilen inerhalb weniger sekunden in die datei geschrieben werden.


Dank schon mal für Ideeen, Vorschläge und Lösungen.

Content-Key: 134588

Url: https://administrator.de/contentid/134588

Printed on: April 16, 2024 at 21:04 o'clock

Member: Biber
Biber Jan 28, 2010 at 12:44:49 (UTC)
Goto Top
Moin Erwin86,

wenn ich deine Anforderung mal von den erwarteten End-Ergebnissen aus betrachte, dann sieht es für mich so aus, als
  • würde heute und in Zukunft ohne dein Zutun/ohne Möglichkeit der Einflussnahme eine Textdatei von einem Programm geschrieben, die streng chronologisch neue Zeilen ans Ende einer Textdatei anfügt, wobei auch identische ("doppelte") Zeilen dabei geschrieben werden können
  • parallel dazu möchtest du eine Datensicht, in der alle Datenzeilen "unique", einmalig vorhanden sind.

Das hört sich für mich nicht danach an, dass diese zweite Anforderung nun unbedingt mit einer physischen 1:1-Kopie aller Datenzeilen (abzgl. Duplikate) gemacht werden müsste mit einem Text-Bearbeitungswerkzeug (Batch oder Skript).

Sondern eher nach einem Zugriff auf diese Textdatei mit irgendetwas, was SQL spricht.

Hast Du nicht auf dem Rechner, wo daa Ganze fliegen soll, irgendein Access/mySQL o.ä. am Laufen?

Denn eine Datensynchronität "in Echtzeit" geht naturgemäß am Einfachsten, wenn es nur EINE Datenquelle gibt statt eine unsortierte/unbereinigte Originaldatei und eine sortierte gefilterte Kopie.

Grüße
Biber
Member: TsukiSan
TsukiSan Jan 28, 2010 at 12:47:10 (UTC)
Goto Top
Ist das auch echtzeit möglich? da manchmal mehrere zeilen inerhalb weniger sekunden in die datei geschrieben werden.
damit hast du zumindest deine letzte Frage selbst beantwortet!
NEIN

Du kannst dir deine Textdatei auslesen bis zur letzten Zeile und eventuell ein findstr dann losjagen und abfragen, ob es diese Zeile schon gibt. Wenn nicht, dann abspeichern.

Gruss
Tsuki
Member: bastla
bastla Jan 28, 2010 at 12:52:22 (UTC)
Goto Top
Du kannst dir deine Textdatei auslesen bis zur letzten Zeile und eventuell ein findstr dann losjagen und abfragen, ob es diese Zeile schon gibt. Wenn nicht, dann abspeichern.
... also etwa so:
@echo off & setlocal
set "Quelle=D:\Textdatei.txt"  
set "Ziel=D:\Sammel.txt"  

if not exist "%Ziel%" copy nul "%Ziel%">nul  
set "Letzte="  
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Letzte=%%i"  
if not defined Letzte echo "%Quelle%" ist leer! & goto :eof  
set "Anz=0"  
for /f %%i in ('findstr /x /c:"%Letzte%" "%Quelle%"') do set /a Anz+=1  
if %Anz% gtr 1 findstr /x /c:"%Letzte%" "%Ziel%">nul || >>"%Ziel%" echo %Letzte%  
Noch als Anmerkung: Es wird auch geprüft, ob die Zeile in der "Sammeldatei" bereits existiert und nur, wenn diese noch nicht vorhanden ist, an die "Sammeldatei" angefügt - sollte diese Prüfung nicht gewollt sein, folgende Zeile 11 verwenden:
if %Anz% gtr 1 >>"%Ziel%" echo %Letzte%

Abgesehen von der "Machbarkeit" sollte aber Bibers Überlegung hinsichlich "Sinnhaftigkeit" nicht untergehen ...

Grüße
bastla

[Edit] Korrekturen (überzähliges "delims" entfernt) bzw Ergänzungen nachgetragen ... [/Edit]
Member: TsukiSan
TsukiSan Jan 28, 2010 at 12:55:09 (UTC)
Goto Top
face-smile bastla hat natürlich wieder die richtige Syntax dafür face-smile

Danke und Gruss
Tsuki
Member: bastla
bastla Jan 28, 2010 at 12:57:02 (UTC)
Goto Top
@tsuki
face-smile bastla hat natürlich wieder die richtige Syntax dafür face-smile
q.e.d. face-wink

Grüße
bastla
Member: TsukiSan
TsukiSan Jan 28, 2010 at 13:12:18 (UTC)
Goto Top
q.e.d.

face-wink mein Latain ist 'ne Weile her. Aber trotzdem danke für deine Ausführung!
Wieder etwas gelernt face-smile

Gruss
Tsuki

[Edit]
q.e.d.
Wen's interessiert:
w.z.b.w. ist die deutsche Abkürzung dafür!
[/Edit]
Member: Biber
Biber Jan 28, 2010 at 13:22:38 (UTC)
Goto Top
Moin TsukiSan und bastla,

jetzt kommt doch garantiert als Nachklappfrage :"Oh toll, und wie kann ich jetzt das Script rund um die Uhr 7*24*365 laufen lassen, damit ich die bereinigte Kopie in Echtzeit habe?"
und vielleicht etwas verschämt der Zusatz :" okay, ich werde wohl nicht 7*24*365 diese Kopie lesen wollen, sondern meist nur jeden Dienstag mittag vor dem Meeting, aber ich will es immer TOPAKTUELL."

Das ist doch mit Melonen auf Spätzle schießen oder wie das heißt.

Oder ich formuliere es mal anders:
Angenommen, die Brahmanen/Hindus haben Recht und wir werden -sollten wir es verdient haben- ständig wiedergeboren.
Davon statistisch gesehen allerdings nur jedes 10te Mal als intelligente Lebensform, meist allerdings als Hund, Darmbakterium, Koralle oder Babelfisch.
Unter Umständen auch mal als Batch.
Möchtet ihr dann den ganzen Tag so einen Unsinn machen?

Grüße
Biber
Member: bastla
bastla Jan 28, 2010 at 13:26:38 (UTC)
Goto Top
@Biber
Möchtet ihr dann den ganzen Tag so einen Unsinn machen?
Kommt auf die Alternativen an (und damit ist noch nicht einmal der Vergleich zum "Darmbakterien-Job" gemeint face-wink) ...

... aber ich verweise gerne nochmals auf
Abgesehen von der "Machbarkeit" sollte aber Bibers Überlegung hinsichlich "Sinnhaftigkeit" nicht untergehen ...

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Jan 28, 2010 at 22:06:46 (UTC)
Goto Top
also ich würd ja besagte batch nur wärend das "Ein Programm" läuft höchstens alle zehn minuten prüfen lassen oder gar nur einmal am Ende und die geforderten Zeilen Loggen.

@ bastla würde es nicht ausreichen nach den letzten Schreibzugriff dieser Datei zu "fragen" und erst ab .... hach da fehlen ja wieder die sekunden.....

Gruß Phil
Member: Erwin86
Erwin86 Jan 30, 2010 at 13:03:39 (UTC)
Goto Top
Mysql datenbank (oder andere datenbanken) habe ich leider nicht zur verfügung.

hmm bei mir funktioniert es nicht, was mach ich falsch? Die Datei Sammel.txt erstellt er aber sie bleibt immer leer.

inhalt der Textdatei.txt:
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 4
Zeile 5
Zeile 3
Zeile 2
Zeile 7

Das script mit echo on:

D:\>set "Quelle=Textdatei.txt"

D:\>set "Ziel=Sammel.txt"

D:\>if not exist "Sammel.txt" copy nul "Sammel.txt" 1>nul

D:\>set "Letzte="

D:\>for /F "usebackq delims=" %i in ("Textdatei.txt") do set "Letzte=%i"

D:\>set "Letzte=Zeile 1"

D:\>set "Letzte=Zeile 2"

D:\>set "Letzte=Zeile 3"

D:\>set "Letzte=Zeile 4"

D:\>set "Letzte=Zeile 4"

D:\>set "Letzte=Zeile 5"

D:\>set "Letzte=Zeile 3"

D:\>set "Letzte=Zeile 2"

D:\>set "Letzte=Zeile 7"

D:\>if not defined Letzte echo "Textdatei.txt" ist leer! & goto :eof

D:\>set "Anz=0"

D:\>for /F %i in ('findstr /x /c:"Zeile 7" "Textdatei.txt"') do set /a Anz+=1


Das mit dem letzten Schreibzugriff ist auch eine gute Idee, würd aber auch ohne gehen, da ich das script dann in einem bestimmten intervall laufen lassen würde.
Member: bastla
bastla Jan 30, 2010 at 13:25:42 (UTC)
Goto Top
Hallo Erwin86!

Leider hatte ich offensichtlich nicht genau genug gelesen ... face-sad

Die letzte Batchzeile müsste eigentlich lauten:
if %Anz%==1 findstr /x /c:"%Letzte%" "%Ziel%">nul || >>"%Ziel%" echo %Letzte%
Soferne (wie es nach dem geposteten Batchlauf zu vermuten ist) die letzte Zeile der "Textdatei" nicht mit einer Zeilenschaltung endet, wäre noch der Wert 1 auf 0 zu ändern, also:
if %Anz%==0 findstr /x /c:"%Letzte%" "%Ziel%">nul || >>"%Ziel%" echo %Letzte%
Grüße
bastla
Member: Erwin86
Erwin86 Jan 30, 2010 at 13:46:59 (UTC)
Goto Top
mit
funktioniert es.

alerdings wird als ergebniss nur "Zeile 7" in die Sammel.txt geschrieben. Zeile 5 die auch nur einmal vorhanden ist hat er nicht erkannt. Was ist jetzt wenn 2 Zeilen datzukommen befor das skript nochmal die Textdatei.txt checked? dann nimmt er nur die letzte zeile und prüft diese und die vorletzte bearbeitet er nicht.
Member: TsukiSan
TsukiSan Jan 30, 2010 at 14:43:47 (UTC)
Goto Top
Hallo Erwin86,

Was ist jetzt wenn 2 Zeilen datzukommen befor das skript nochmal die Textdatei.txt checked? dann nimmt er nur die letzte zeile und prüft diese und die vorletzte bearbeitet er nicht.

Was, wenn die Ausgangsdatei zufällig in diesem Moment gelöscht wird?
Was, wenn gerade Stromausfall ist?
und, und, und......

Mach es dir doch einfach und wie oben schon einmal angemerkt:
vergiss in deinen Fall die "Echzeit"-geschichte. Das bringt dich nur auf krumme Ideen und zu viele "IFs" face-wink

Frage sie aller paar Minuten oder Stunden - oder besser noch! - einmal kurz vor Feierabend ab.
Dann hast du den letzten Stand an Daten und ein Batch muss nur einmal ausgeführt werden. Damit hat es (dein Batch) weiniger Chancen, Fehler zu machen und es wird weniger von menschlichen Fehlern beeinflußt.

Gruss
Tsuki
Member: bastla
bastla Jan 30, 2010 at 19:21:45 (UTC)
Goto Top
Hallo Erwin86!

Abgesehen von Tsukis Anmerkungen: Ließe sich denn Dein Ziel - ursprünglich war das ja einmal
Bat ... die die neu geschrieben Zeile (immer die letzte) mit allen anderen Zeilen vergleicht
- nicht umformulieren auf: Alle Zeilen der "Textdatei" sollen genau einmal in die "Sammel"-Datei übertragen werden? Dann würde es genügen, für alle Zeilen die "Sammel"-Datei zu durchsuchen. Wie zeitnah das sein soll, musst Du natürlich selbst wissen ...

... aber umsetzen solltest Du das so können:
@echo off & setlocal
set "Quelle=D:\Textdatei.txt"  
set "Ziel=D:\Sammel.txt"  

if not exist "%Ziel%" copy nul "%Ziel%">nul  
for /f "usebackq delims=" %%i in ("%Quelle%") do findstr /x /c:"%%i" "%Ziel%">nul || >>"%Ziel%" echo %%i  
Grüße
bastla
Member: Biber
Biber Jan 30, 2010 at 20:06:49 (UTC)
Goto Top
Moin Erwin86,

und noch abstrakter als Tsuki Sans und bastlas Aspekte die Fragen:

  • Was ist denn dein Ziel aus Prozesssicht jenseits der handwerklich-technischen Umsetzung?

  • WofürTF brauchst du - und vor allem wie oft- eine Sicht auf die einmalig vorhandenen diskreten Einträge in der stupide weggeschriebenen Wucherdatei?

  • Und was kannst du damit tatsächlich anfangen? (Beispiel: Wenn in der chronologisch geschriebenen Datei 2 Mio Zeilen sind und du durch Sortieren und Eindampfen auf "nur" 20000 unterschiedliche Zeilen kommst - ja hey! Auch dieser Zustand versetzt dich doch nicht in die Lage, zu irgendetwas scnnell aussagefähig zu sein. Folgen da Auswertungen oder Kategorisierungen oder was ist der Plan?

Ich würde jedenfalls ungern diesen Beitrag auf als "Gelöst" gesetzt sehen, weil ich irgendwie das Gefühl habe, wir haben zwar auf die wortwörtliche Frage geantwortet, aber es sieht doch nicht nach einer "Lösung" aus.

Bitte zerstreue meine Bedenken... face-wink

Grüße
Biber
Member: Erwin86
Erwin86 Jan 31, 2010 at 12:33:55 (UTC)
Goto Top
Danke, genauso hab ich mir das gedacht.

so soll das funktionieren.

Thema Erledigt
Hotly discussed
DaniEnd of Support dates for Office 2016, 2019 Apps und Productivity ServersDani - 1 Comment