Top-Themen

Aktuelle Themen (A bis Z)

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

Zeilen aus Textdatei auslesen und modifiziert in eine neue Textdatei schreiben

Frage Entwicklung Batch & Shell

Mitglied: MaxUser

MaxUser (Level 1) - Jetzt verbinden

06.02.2009, aktualisiert 18.10.2012, 6335 Aufrufe, 7 Kommentare

Hallo allerseits,

da ich neu bin grüsse ich zuerst alle MItglieder.

Nun zu meine Frage. Ich möcte gerne ein Batchprgramm schreiben (eine Datei "xxx.bat") der folgendes machen soll.

In eine Quell-Textdatei steht folgender Inhalt

CL08001407
CL08002715
CL08002913
CL08003313

Der Batch soll mir diese vier Zeilen bzw. alle vorhandene Zeilen auslesen und wie folgt in die erste Zeile eines Ziel-TextDatei schreiben

CL08001407|CL08002715|CL08002913|CL08003313

Darf dabei die QuellDatei und die Zieldatei geöffnet sein? Oder müssen beide geschlossen sein?

Will noch hindeuten das ich in Sachen Batchprogrmmierung sehr neu bin. Darum wär für mich hilfreich den möglichen Lösungs-Code von A-Z zu erhalten^^
Mitglied: bastla
06.02.2009 um 09:38 Uhr
Hallo MaxUser und willkommen im Forum!
Der Batch soll mir diese vier Zeilen bzw. alle vorhandene Zeilen auslesen und wie folgt in die erste Zeile eines Ziel-TextDatei schreiben
Diese Anforderung solltest Du noch etwas konkretisieren:
- Sollen nur die 4 Werte in die erste Zeile, oder tatsächlich alle Zeilen zu einer einzigen zusammengefasst werden?
- Wenn nur die angesprochenen 4 Zeilen zu einer zusammngefasst werden sollen: Woran sind diese Zeilen zu erkennen? Beginnen Sie etwa als einzige mit "CL"?
- Und noch eine Frage: sind es immer genau 4 Zeilen?

Darf dabei die QuellDatei und die Zieldatei geöffnet sein?
Soll die Zieldatei denn nicht neu erstellt, sondern eine bereits vorhandene Datei verändert werden?

Grüße
bastla
Bitte warten ..
Mitglied: MaxUser
06.02.2009 um 09:52 Uhr
Hallo Bastla,

danke für dein Beitrag.

es sollen alle vorhandene Zeilen zu eine Zeile zusammengefügt werden und mit einen pipe getrennt werden. Das mit den 4 Zeilen war nur ein Beispiel

aus drei vorhandene zeilen

AB
BC
DF

soll folgendes erfolgen

AB|BC|DF

Es wär noch besser wenn das Ergebnis automatisch in die Zwischenablage kopiert wird, da es für ein Filter weiterbenutzt wird.
Ansonsten wär es auch gut wenn das Ergebnis in eine neue Zeile der Quelldatei geschrieben wird. Also die Quelltextdatei würde dann folgend aussehen

AB
BC
DF
AB|BC|DF
Bitte warten ..
Mitglied: bastla
06.02.2009 um 10:49 Uhr
Hallo MaxUser!

Das Zusammenfassen könnte etwa so gehen:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Quellordner\Quelldatei.txt" 
03.
 
04.
set Zeile= 
05.
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i" 
06.
>>"%Quelle%" echo\ 
07.
>>"%Quelle%" echo %Zeile:~2% 
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
set "Zeile=%Zeile%^|%~1" 
12.
goto :eof
Falls Du vor der zusammengefassten Zeile noch eine Leerzeile erhältst, die Batchzeile 6 weglassen.

Noch ein Hinweis: Sonderzeichen (wie etwa "&", "<", ...) könnten Probleme bereiten (oder müssten zumindest gesondert behandelt werden).

Grüße
bastla

P.S.: Eine Beschreibung des Ablaufes kann ich erst später am Tag nachreichen ...
Bitte warten ..
Mitglied: MaxUser
06.02.2009 um 11:08 Uhr
Hi Bastla,

danke für den Code. in der zusammengefassten Zeile bekomme ich jetzt eine Meldung

ECHO ist ausgeschaltet (OFF).

Was muss ich da machen?
Bitte warten ..
Mitglied: bastla
06.02.2009 um 12:09 Uhr
Hallo MaxUser!

Diese Meldung bedeutet, dass keine Daten geschrieben werden konnten - mögliche Gründe:
- die in Zeile 2 angegebene Quelldatei enthält nur Leerzeilen (vermutlich auszuschließen )
- der Variablenname %Zeile% ist in Zeile 7 des Batches anders geschrieben als in Zeile 11

Grüße
bastla
Bitte warten ..
Mitglied: MaxUser
06.02.2009 um 12:31 Uhr
Hallo

habe nochmal den Code in die Batchdatei kopiert.

Jetzt funktioniert es wunderbar.

Vielen Dank und ein schönes Wochenende.
Bitte warten ..
Mitglied: bastla
06.02.2009, aktualisiert 18.10.2012
Hallo MaxUser!
Jetzt funktioniert es wunderbar.
Freut mich.

Wie versprochen noch einige Anmerkungen zum Code:
@echo off & setlocal
und
set "Quelle=D:\Quellordner\Quelldatei.txt"
habe ich hier schon mal kurz beschrieben ...

set Zeile=
Eigentlich sollte es die Variable %Zeile% zu Beginn des Batches ohnehin nicht geben - jetzt existiert diese aber ganz sicher nicht (wird durch diese "Zuweisung" gelöscht).

for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i"
Zu den Inhalten dieser Zeile findest Du ebenfalls an anderer Stelle einige Anmerkungen - Sinn dieser Zeile ist es, jede Zeile einzeln auszulesen und an das Unterprogramm ":ProcessLine" am Stück (daher unter Anführungszeichen zu setzen) weiter zu reichen.

>>"%Quelle%" echo\ 
>>"%Quelle%" echo %Zeile:~2%
Diese beiden Zeilen schreiben eine Leerzeile sowie den Inhalt der Variablen %Zeile% nach dem zweiten Zeichen jeweils an das Ende der Quelldatei (">>" bedeutet "Anfügen", mit ">" würde eine neue Datei erstellt = die bestehende überschrieben). Da die Variable %Zeile% als erste Zeichen "^|" (vom Hinzufügen der ersten Zeile) enthält, kann die Ausgabe erst nach Position 2 erfolgen.

goto :eof
Damit wird ein Batch (und auch ein Unterprogramm kann als "Batch" im "Batch" betrachtet werden - siehe unten) beendet (stellt sicher, dass das danach folgende Unterprogramm nicht ein weiteres - und damit überflüssiges - Mal ausgeführt wird und ist somit die Stelle, an welcher der gesamte Batch beendet wird.

:ProcessLine 
set "Zeile=%Zeile%^|%~1" 
goto :eof
Dieses Unterprogramm wird für jede Zeile der Quelldatei aufgerufen und stellt eigentlich einen eigenen Batch dar - deshalb kann es auch den (ersten und einzigen) beim Aufruf übergebenen Parameter "Zeileninhalt" als %1 übernehmen.

Verarbeitet wird dieser Parameter, indem an den aktuellen Inhalt der Variablen %Zeile% (beim ersten Aufruf ist diese noch nicht vorhanden und daher "leer") zunächst ein "|" und danach die übergebene Zeile angefügt wird. Mit "%~1" anstelle von "%1" wird der Parameter ohne die umgebenden Anführungszeichen angesprochen.

Mit der Schreibweise "^|" wird das Pipe-Sysmbol "maskiert", was dem Interpreter mitteilt, dass es als gewöhnliches Zeichen und nicht als Verbindung zur nächsten Anweisung zu verstehen ist.

"goto :eof" hat die schon oben beschriebene Funktion, das Ende dieses Programmteiles (und damit hier - in einem Unterprogramm - die Anweisung zum Rücksprung in das Hauptprogramm -konkret in die "for"-Schleife - zu signalisieren). An dieser Stelle des Batches könnte es auch weg gelassen werden, da nach der letzten Batchzeile ein automatisches "goto :eof" ausgeführt wird - da es aber nicht schadet, schreibe ich es sicherheitshalber grundsätzlich hin, um es im Fall des Falles unterhalb das Platzieren weiterer Programmteile zu ermöglichen.

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Textdatei Zeile für Zeile auslesen
Frage von RIPUEDBatch & Shell

Hallo, ich würde gerne mit einem Batch-Skript Zeilen aus einer Textdatei einzeln und nacheinander auslesen und diese dann nach ...

Batch & Shell
Erstellungsdatum vor jede Zeile einer Textdatei schreiben
gelöst Frage von freakonaleashBatch & Shell5 Kommentare

Hallo zusammen, ich habe einen Ordner mit ganz vielen Textdateien. Ich bräuchte eine Batch, die in jede Datei vor ...

Batch & Shell
Komplette Zeile aus Textdatei auslesen
gelöst Frage von tegwertBatch & Shell3 Kommentare

Hallo zusammen! Ich möchte aus einer Textdatei immer die Zeile 4 auslesen und dessen Inhalt in eine Variable übernehmen. ...

Batch & Shell
Bestimmte Zeile einer Textdatei mit Batch auslesen
gelöst Frage von PinkFLuffyUnicornBatch & Shell2 Kommentare

Hi, ich habe ein kleines Batch Script, welches mir den Status der Firewall ausgeben soll(ob an oder aus) der ...

Neue Wissensbeiträge
Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 StundenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 3 StundenSicherheit5 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 4 StundenSicherheit4 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Sicherheit

Meltdown und Spectre: Die machen uns alle was vor

Information von Frank vor 4 StundenSicherheit12 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Heiß diskutierte Inhalte
Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1031 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell29 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen19 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...