Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textdatei auslesen und verarbeiten

Frage Entwicklung Batch & Shell

Mitglied: Erwin86

Erwin86 (Level 1) - Jetzt verbinden

28.01.2010 um 13:28 Uhr, 5344 Aufrufe, 16 Kommentare

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.
Mitglied: Biber
28.01.2010 um 13:44 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
28.01.2010 um 13:47 Uhr
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
Bitte warten ..
Mitglied: bastla
28.01.2010 um 13:52 Uhr
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:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Textdatei.txt" 
03.
set "Ziel=D:\Sammel.txt" 
04.
 
05.
if not exist "%Ziel%" copy nul "%Ziel%">nul 
06.
set "Letzte=" 
07.
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Letzte=%%i" 
08.
if not defined Letzte echo "%Quelle%" ist leer! & goto :eof 
09.
set "Anz=0" 
10.
for /f %%i in ('findstr /x /c:"%Letzte%" "%Quelle%"') do set /a Anz+=1 
11.
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]
Bitte warten ..
Mitglied: TsukiSan
28.01.2010 um 13:55 Uhr
bastla hat natürlich wieder die richtige Syntax dafür

Danke und Gruss
Tsuki
Bitte warten ..
Mitglied: bastla
28.01.2010 um 13:57 Uhr
@Tsuki
bastla hat natürlich wieder die richtige Syntax dafür
q.e.d.

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
28.01.2010 um 14:12 Uhr
q.e.d.

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

Gruss
Tsuki

[Edit]
q.e.d.
Wen's interessiert:
w.z.b.w. ist die deutsche Abkürzung dafür!
[/Edit]
Bitte warten ..
Mitglied: Biber
28.01.2010 um 14:22 Uhr
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
Bitte warten ..
Mitglied: bastla
28.01.2010 um 14:26 Uhr
@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 ) ...

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

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
28.01.2010 um 23:06 Uhr
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
Bitte warten ..
Mitglied: Erwin86
30.01.2010 um 14:03 Uhr
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
D:\>if 0 GTR 1 findstr /x /c:"Zeile 7" "Sammel.txt" 1>nul || echo Zeile 7 1>>"Sammel.txt"

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.
Bitte warten ..
Mitglied: bastla
30.01.2010 um 14:25 Uhr
Hallo Erwin86!

Leider hatte ich offensichtlich nicht genau genug gelesen ...

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
Bitte warten ..
Mitglied: Erwin86
30.01.2010 um 14:46 Uhr
mit
if %Anz%==0 findstr /x /c:"%Letzte%" "%Ziel%">nul || >>"%Ziel%" echo %Letzte%
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.
Bitte warten ..
Mitglied: TsukiSan
30.01.2010 um 15:43 Uhr
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"

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
Bitte warten ..
Mitglied: bastla
30.01.2010 um 20:21 Uhr
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:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Textdatei.txt" 
03.
set "Ziel=D:\Sammel.txt" 
04.
 
05.
if not exist "%Ziel%" copy nul "%Ziel%">nul 
06.
for /f "usebackq delims=" %%i in ("%Quelle%") do findstr /x /c:"%%i" "%Ziel%">nul || >>"%Ziel%" echo %%i
Grüße
bastla
Bitte warten ..
Mitglied: Biber
30.01.2010 um 21:06 Uhr
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...

Grüße
Biber
Bitte warten ..
Mitglied: Erwin86
31.01.2010 um 13:33 Uhr
Danke, genauso hab ich mir das gedacht.

so soll das funktionieren.

Thema Erledigt
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

HTML
gelöst Mit HTML Datei eine Textdatei auslesen (7)

Frage von Maffi zum Thema HTML ...

Google Android
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) (4)

Frage von lordzwieback zum Thema Google Android ...

Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...