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
Kommentar vom Moderator Biber am 06.02.2012 um 21:40:32 Uhr
Nervigen Tippfehler im Titel berichtigt
GELÖST

Mehrere .txt mit Batch auslesen und verändern ?

Frage Entwicklung Batch & Shell

Mitglied: DaMoRph

DaMoRph (Level 1) - Jetzt verbinden

06.02.2012, aktualisiert 21:40 Uhr, 3873 Aufrufe, 16 Kommentare

Hallo zusammen,

ich möchte gerne eine Batch schreiben, habe aber feststellen müssen das meine Kenntnisse für diesen umfang nichtmehr ausreichen oder es mit einer Batch nicht evtl. garnicht geht...

Es geht darum dass ich in einen Ordner beliebige aber immer gleiche Art von Dateien kopiere für eine spätere Auswertung.

Diese Dateien haben einen nummerischen Namen Bsp. 101219246720.txt in dieser Datei gibt es ca. 27 Zeilen mit Alphanummerischen Werten,
wobei die ersten 3 die läge der Zeile angeben und nächsten 4 Ziffern immer angeben welcher wert dann kommt.

Ich möchte nun gerne mit dieser Batch bei allen Zeilen die ersten 3 Ziffern Löschen, die werden nicht benötigt.

Und dann alle Zeilen bis auf ca. 13 die dann mit den bestimmten Ziffer beginnen löschen.

Zudem gibt es in dem Ordner ca. 50 dieser txt. Immer andere nummerischer Name bei denen das passieren soll.

Ist das überhaupt mit einer Batch zu realisieren ?

Meine Idee war diese Werte mit Find zu suchen in eine neue Datei zu speichern, die alte zu löschen und diese neue dann in die alte umzubenennen aber ich scheiter da kläglich dran.

könnt ihr mir helfen?
Mitglied: pieh-ejdsch
06.02.2012 um 10:17 Uhr
moin DaMoRph,

also Ungetestet würde dies etwa so sein:

01.
@echo off &setlocal 
02.
set "Quelle=D:\Testordner" 
03.
set "Ziel=D:\Anderer Ordner" 
04.
 
05.
set "DateiFilter=[0-9]*.txt" 
06.
 
07.
set "ZeileLöschen=1234" 
08.
 
09.
pushD "%quelle%" 
10.
for /f "delims=" %%i in ('dir /b *.txt ^|findstr /r /b "%DateiFilter%"') do call :Files "%%i" 
11.
popD 
12.
goto :eof 
13.
:Files 
14.
15.
for /f "usebackq delims=" %%i in (%1) do (@set "Line=%%i" 
16.
  @setlocal enabledelayedexpansion 
17.
  @echo !Line:~3! 
18.
  @endlocal 
19.
20.
) | findstr /v /b "%ZeileLöschen%" > "%Ziel%\%~nx1"
[edit] popD nachgezogen [/edit]
[edit2 usebackq nachgezogen ... und in die Richtige Zeile gesteckt/edit]
EDIT funktioniert doch nicht, da delayed Ausdrücke in mit Klammern zusammengefassten Befehlszeilen als nichtdelayed Ausdrücke im Übergebenen Befehl nicht automatisch delayed ausgegeben werden.
/EDIT

Gruß Phil
Bitte warten ..
Mitglied: DaMoRph
06.02.2012 um 11:39 Uhr
Ui, das ging ja fix.
kannst du mir das evtl. noch in Stichpunkten erläutern ?
das währe super.
Bitte warten ..
Mitglied: pieh-ejdsch
06.02.2012 um 12:37 Uhr
hmmm, ich versuch es mal
also in

Zeile 2 und 3 bestimmst Du den Quellordner und den Zielordner.

In Zeile 5 bestimmt Du den Filter fürs Filtern der TXT Dateien (nur Ziffern vor der Dateiendung).

In Zeile 7 bestimmst Du den Filter fürs entfernen der Zeilen, weche ab dem 4. Zeichen diese Ziffern übereinstimmend enthalten.

In Zeile 9 wird in das Quellverzeichnis gewechselt.
In Zeile 10 werden alle TXT laut DateiFilter nacheinander dem Unterprogramm :Files als ersten Parameter Übergeben.

Nun SchauMaMal was das Unterprogramm macht:
In Zeile 14 sorgt die öffnende Klammer und die Schliessende Klammer von Zeile 20 für eine Gesamtausgabe der For Schleife.
In Zeile 15 bis 19 stelle ich fest die Option usebackq fehlt, um den Dateiinhalt abzuarbeiten
wird jede Zeile der übergebenen TXT ohne die ersten 3 Zeichen ausgegeben.
In Zeile 15 bis 18 sorgt das @ fürs ausblenden der Befehle, damit dem Findstr nur die reinen AusgabeZeilen übergeben werden.
In Zeile 20 werden die Zeilen nicht angezeigt, welche mit den Inhalt von ZeileLöschen beginnen und in eine TXT im Zeilordner eingefügt.

In Zeile 11 und 12 wird erst aus dem Quellverzeichnis wieder zurückgesprungen und anschliesend der Batch Beendet.

Gruß Phil
Bitte warten ..
Mitglied: DaMoRph
06.02.2012 um 15:04 Uhr
Vilen dank schon mal für die Mühe,

ich habe das jetzt ausprobiert, aber es will nicht.
Die Batch erzeugt keine txt in dem anderen Ordner.
Und ich denke ich brauche den filter für den Namen der txt nicht denn die Batch kann bzw. soll alle Dateien die in dem Ordner sind bearbeiten.
Frage: der Parameter der den Wert für die zu löschende Zeile enthält, wie kann ich da mehrere werte hinzufügen? Denn es sin ja mehrere Zeilen die zu löschen sind.


Mit freundlichen Grüßen S.Meister
Bitte warten ..
Mitglied: bastla
06.02.2012 um 16:10 Uhr
Hallo DaMoRph und willkommen im Forum!

Wenn Du keinen Dateifilter benötigst, könntest Du es mit der folgende Variante versuchen:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Testordner" 
03.
set "Ziel=D:\Anderer Ordner" 
04.
 
05.
set "ZeileLöschen=...1234 ...0000" 
06.
 
07.
md "%Ziel%" 2>nul 
08.
pushD "%quelle%" 
09.
for /f "delims=" %%i in ('dir /b *.txt') do call :Files "%%i" 
10.
popD 
11.
goto :eof 
12.
:Files 
13.
14.
for /f "delims=" %%i in ('findstr /v /b "%ZeileLöschen%" %1') do ( 
15.
    set "Line=%%i" 
16.
    setlocal enabledelayedexpansion 
17.
    echo !Line:~3! 
18.
    endlocal 
19.
20.
)>"%Ziel%\%~nx1"
Hier werden alle Zeilen entfernt, welche ab der 4. Stelle (deswegen jeweils die 3 Punkte davor) die Werte 1234 oder 0000 enthalten ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
06.02.2012 um 19:11 Uhr
moin bastla,

Deine funktioniert sogar. Ich habe nicht getestet.
Ich dachte es geht - aber falsch gedacht. Abgesehen davon das das usebackq in der falschen For war und kein Zielverzeichnis erstellt wird wenn es fehlt.
Es wird nur der Text !Line:~3! in die TXT geschrieben.
Das kann ich mir nur so erklären, dass der Befehl in der Klammer immer ohne delayedexpansion mit den folgenden Verknüpft wird.
01.
set "line=abcde" 
02.
setlocal enabledelayedexpansion 
03.
(echo !line!)|findstr /n "^" 
04.
endlocal
Umleitungen klappen aber immer --- Komisch.
In Jebs Die Geheimnisse des Batch Zeilen Interpreters ist es nicht aufgeführt oder daraus abzuleiten.

Gruß Phil
Bitte warten ..
Mitglied: bastla
06.02.2012 um 19:25 Uhr
@PH
Deine funktioniert sogar.
Ja, ich war auch ganz erschrocken ...

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
06.02.2012 um 20:57 Uhr
Hallo Phil,

auch dafür hatte jeb eine Erklärung, allerdings englisch ...
Why does delayed expansion fail when inside a piped block of code?
Stark vereinfacht: Beide Seiten der Pipe werden in ihrem eigenen Kommandozeilenkontext ausgeführt. Die verzögerte Variablenerweiterung wird dabei nicht vererbt. Ich hoffe, der verlinkte Thread trägt zum Verständnis bei.

Grüße
rubberman
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 00:53 Uhr
moin rubberman,

Wie lange läufst Du denn schon?

Ja ist einleutend mit dem Pipen aber
da kamma ja Improvisieren...
01.
setlocal 
02.
set "line=abcdexxx" 
03.
set "line2=12345xxx" 
04.
set "linea=xyz123abc" 
05.
 
06.
setlocal enabledelayedexpansion 
07.
08.
echo !line! 
09.
echo !line2! 
10.
echo !linea! 
11.
)|findstr /n "^" 
12.
 
13.
rem wenn das so nicht funktioniert dann bleibt ja als Variation fast nur das uebrig: 
14.
 
15.
>Line.cmd (@echo @setlocal enabledelayedexpansion&@echo @echo(^^!Line%%~1%%~2%%~3%%~4%%~5%%^^!) 
16.
 
17.
18.
line :~3 
19.
line : "~3,-3" 
20.
line 2 ":*5=" 
21.
line a : ~ 5 
22.
line a 
23.
)|sort|findstr /n "^" 
24.
 
25.
call line 2 ":*3=" 
26.
 
27.
pause
auch
ganz erschrocken ...
Gruß Phil
Bitte warten ..
Mitglied: rubberman
07.02.2012 um 01:06 Uhr
Hallo Phil.

Zitat von pieh-ejdsch:
Wie lange läufst Du denn schon?
Och, so ca. seit 40 Jahren (meistens mit nächtlichen Unterbrechungen)

Für kürzere Sequenzen kannst du auch direkt die cmd mit den entsprechenden Optionen aufrufen.
01.
set "line=abcde" 
02.
(cmd /q /v:on /c "echo(!line!")|findstr /n "^"
Mehrere Zeilen eben per & verknüpfen, fertig.
Natürlich ist das Ganze grottenlangsam, für jede Zeile einmal cmd und findstr als externe Tools zu laden. Allerdings habe ich jetzt auch nicht DIE Lösung parat. Ich denke bastlas Code ist da ziemlich nah am Optimum, da findstr auf die Datei, nicht aber auf jede einzelne Zeile angewendet wird.

Grüße
rubberman
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 09:29 Uhr
moin rubberman,
na da lauf ich ja erst ca 34 Jahre herum meinte ja Dein Bildchen
Natürlich ist das Ganze grottenlangsam ... bastlas Code ist da ziemlich nah am Optimum.
sehe ich auch so - daher habe ich ja ganz oben den Roten Merker eingügt (und den nicht so funtionierenden Code so stehen gelassen,und weil es hier vollkommen unproduktiv ist).

Wieder einen Grund mehr VBS anzuwenden bzw weiter zu lernen.

Gruß Phil
Bitte warten ..
Mitglied: bastla
07.02.2012 um 10:33 Uhr
Hallo PH und rubberman!
Wieder einen Grund mehr VBS anzuwenden
Ich hab das mal als Auftrag verstanden :
01.
Quelle = "D:\Testordner" 
02.
Ziel = "D:\Anderer Ordner" 
03.
 
04.
Muster = "#1234#0000#8765#" 'weitere Suchbegriffe zum Entfernen von Zeilen hier - mit # begrenzt - hinzufügen 
05.
Entfernen = 3 'Zeichenanzahl, die am Zeilenanfang entfernt werden soll 
06.
Testen = 4 'Zeichenanzahl, die am Anfang der neuen Zeile geprüft werden soll 
07.
 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
If Not fso.FolderExists(Ziel) Then fso.CreateFolder(Ziel) 
10.
 
11.
For Each File In fso.GetFolder(Quelle).Files 
12.
    TextAlt = Split(File.OpenAsTextStream.ReadAll, vbCrLf) 
13.
    TextNeu = "" 
14.
    For Each Line In TextAlt 
15.
        If InStr(Muster, "#" & Mid(Line, Entfernen + 1, Testen) & "#") = 0 Then 
16.
            TextNeu = TextNeu & vbCrLf & Mid(Line, Entfernen + 1) 
17.
        End If 
18.
    Next 
19.
 
20.
    'Die ersten beiden Zeichen in "TextNeu" stellen eine Zeilenschaltung dar und 
21.
    '  werden deshalb bei der Ausgabe übersprungen. 
22.
    fso.CreateTextFile(Ziel & "\" & File.Name).Write Mid(TextNeu, 3) 
23.
Next
Grüße
bastla
Bitte warten ..
Mitglied: DaMoRph
07.02.2012 um 15:05 Uhr
Hi zusammen,
ich bin eben erst wieder dazu gekommen es zu testen, ...und esl läuft super :D
Ich danke euch viel mals dafür.
Ich werde administrator.de gleich mal meinen Kollegen weiterempfehlen!

Aber eine Frage oder bitte habe ich noch, im Momment löschen wir das was Find findet.
Ist es auch umgekehrt möglich das wir alles aus der Datei löschen, bis auf die zeilen mit den bestimmten ziffern an stelle 4-7 ?

Mit freundlichen Grüßen S.Meister
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 15:54 Uhr
moin DaMoRph,

natürlich - die Option /Vertausche Gefundenes mit Nicht gefundenem Ergebnis Weglassen.
die CMD-Hilfe help findstr gibt Dir immer Antworten.

Gruß Phil
Bitte warten ..
Mitglied: bastla
07.02.2012 um 16:00 Uhr
... und im VBScript wäre die Zeile 15 auf
If InStr(Muster, "#" & Mid(Line, Entfernen + 1, Testen) & "#") <> 0 Then
zu ändern ...

Grüße
bastla
Bitte warten ..
Mitglied: DaMoRph
07.02.2012 um 16:01 Uhr
Hi,
ja super läuft, hätte aber eben nicht gedacht das ich nur den Parameter weg lassen muss


Vielen dank euch noch mal

Mit freundlichen Grüßen S.Meister
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...