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

Bestimmte Stellen von Textdateien auslesen und in neue Datei schreiben

Frage Entwicklung Batch & Shell

Mitglied: Mikefield

Mikefield (Level 1) - Jetzt verbinden

28.01.2009, aktualisiert 23:54 Uhr, 5945 Aufrufe, 11 Kommentare

Werte aus Reportdateien extrahieren und in eine Datei schreiben, zwecks späterem Excel Import

Hallo in die Runde, das ist ein Superforum und eine wahre Fundgrube. Habe schon viel versucht und noch mehr gesucht. Aber nun bin ich doch am Ende meines Halbwissens. Ich habe hier Textdateien die täglich erstellt und mit dem aktuellen Datum versehen werden. Am Monatsende sollen diese Textdateien ausgewertet und die Resultate in einer Datei geschrieben werden. Aus diesen Dateien benötige ich zum einen den Wochentag aus der ersten Zeile und 3 Textelemente aus der 3. Zeile. Diese Textelemente habe ich mit "" gekennzeichnet, diese sind dort sonst nicht enthalten. Dummerweise greift hier die for Schleife nur bei den ersten beiden Werten, aber "Tokens=" geht nur bis 31. Set /P geht auch nicht, da die Zahlen unterschiedliche Längen haben und so immer wieder variieren. lmld_2009-01-23.txt
01.
2009-01-23  7:02 PM  -  textblablabla 
02.
 
03.
"20090123" 1903 0 0 0 0 0 0 "3" 6276 963 119 80 174 27 102 85 95 60 43 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 102 30 5 5 5 3 5 5 4 4 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0     "16.8"    475.2      0.6      0.1 0     16.1 1
Das Ergebnis soll wie folgt aussehen, pro Datei eine Zeile, diese soll später mal in Excel impoertiert werden :
20090123;23;3;16.8
20090124;24;5;18.6
.
.
.

Soweit bin ich für die 3. Zeile schon mal gekommen, aber wie nun weiter? Die erste Zeile für sich bekomme ich auch nicht separiert. OK, das Datum kann man auch aus 20090123 nehmen, die 23. Aber da hilft die for Schleife auch nicht viel weiter. Und alle Werte sollen ja in einer Zeile stehen ....
01.
@Echo off 
02.
setlocal EnableDelayedExpansion 
03.
for /f "delims=" %%a in ('Dir /b /o:n lmld*.txt') do ( 
04.
for /f "skip=2 delims=" %%b in ('"type %%a"') do (
Ich bedanke mich schon mal im Voraus. Es gibt noch weitere Dateien die ähnlich aufgebaut sind, aber diese hier ist der größte Knackpunkt und ich denke wenn das funktioniert, kann ich die anderen davon ableiten.

mf
Mitglied: bastla
28.01.2009 um 22:59 Uhr
Hallo Mikefield und willkommen im Forum!

Vielleicht solltest Du noch erklären, wie die letzte Textstelle zu finden ist - als Token Nr 138 (mit Leerzeichen oder TAB als Delimiter) oder als erster Dezimalwert (mit ".") ...

Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
28.01.2009 um 23:39 Uhr
Das ist es ja. ich hatte es mit der Leerstelle versucht, aber ab Token größer 31 wurde kein Wert mehr ausgegeben. Mit TAB oder Dezimalwert habe ich es nicht versucht, wußte nicht wie.

mf
Bitte warten ..
Mitglied: bastla
29.01.2009 um 00:15 Uhr
Hallo Mikefield!

Eigentlich würde ich in diesem Fall ja eher zu VBScript greifen, aber so recht und schlecht (und frei von jeder Eleganz ) müsste sich das doch auch in Batch machen lassen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Erg=D:\Ergebnisdatei.txt" 
03.
 
04.
if exist "%Erg%" del "%Erg%" 
05.
 
06.
for /f "delims=" %%a in ('Dir /b /o:n lmld*.txt') do ( 
07.
    set Zeile= 
08.
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
09.
    call :ProcessLine1 "!Zeile!" 
10.
 
11.
    set Zeile= 
12.
    for /f "usebackq skip=2 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
13.
    call :ProcessLine3 !Zeile! 
14.
15.
goto :eof 
16.
 
17.
:ProcessLine1 
18.
for /f "tokens=3 delims=- " %%i in (%1) do set "Tag=%%i" 
19.
goto :eof 
20.
 
21.
:ProcessLine3 
22.
set "Datum=%~1" 
23.
set "Wert2=%~9" 
24.
for /L %%i in (1,1,137) do shift 
25.
set "Wert3=%~1" 
26.
 
27.
>>"%Erg%" echo %Datum%;%Tag%;%Wert2%;%Wert3% 
28.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
29.01.2009 um 19:24 Uhr
Hallo bastla,

was soll ich sagen, es funktioniert! Vielen Dank!!!
Auch wenn ich nur zum Teil verstehe was da passiert.
Die erste for Schleife ist klar, aber dann die Zweite, da haperts:
01.
for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
02.
    call :ProcessLine1 "!Zeile!"
Dieses if not defined Zeile set "Zeile=%%b" will sich mir nicht erklären. Und dann zum Schluß, das "!Zeile!" wie verknüpfen die beiden sich? Hier wird ja nur Zeile 1 ausgewertet, wie wird dieses eingegrenzt?
Zu ProcessLine3, hätte man da nicht auch für den Wert3 ein "Wert3=%~137" setzen können?


Herzlichst
mf
Bitte warten ..
Mitglied: bastla
29.01.2009 um 19:43 Uhr
Hallo Mikefield!

Allgemein: Mit "if defined Variable" kann überprüft werden, ob es die Variable bereits gibt.

Da ich vorweg mit "set Zeile=" die Variable %Zeile% lösche, ist beim ersten Durchlaufen der "for"-Schleife diese Variable nicht vorhanden ("not defined") und wird daher mit dem Inhalt der Zeile 1 erstellt. Bei jedem weiteren Durchlauf ist die Variable dann aber schon da, sodass sie nicht mehr neu gesetzt wird und nach der Schleife daher immer noch die Zeile 1 enthält.

Die Schreibweise "!Zeile!" anstelle von "%Zeile%" ist bei Verwendung von "delayedExpansion" erforderlich - letzteres wiederum wird benötigt, damit schon innerhalb der (äußeren) "for"-Schleife auf den Inhalt der neu erstellten Variablen zugegriffen werden kann - und diese wird benötigt, damit sie an das Unterprogramm als Liste von Parametern übergeben (und dadurch dort dann zerpflückt) werden kann.
Zu ProcessLine3, dieses set "Wert2=%~9" wie wird hier gezählt, denn der 9. Wert in der Zeile ist es ja nicht.
Doch - mit "Wert2" ist ja "3" gemeint.
Hätte man da nicht auch für den Wert3 ein "Wert3=%~137" setzen können?
Nein - bei %9 ist Schluss; daher werden mit "shift" die Parameter "nach links verschoben": %1 fällt weg, %2 wird %1, %3 wird %2 and so on ...
Wird das oft genug gemacht (dafür die Zählschleife bis 137), ist schließlich Parameter 138 als %1 anzusprechen - nicht sehr elegant, aber, wie's scheint, doch effektiv ...

Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
29.01.2009 um 20:02 Uhr
Hallo bastla,

OK, so habe ich es jetzt verstanden, Danke für die Erklärung!
Das mit dem Wert2 ist OK, Du warst zu schnell mit der Antwort. Habe es oben in meiner Antwort schon gelöscht. Dummerweise hatte ich in der falschen Datei reingeschaut und da stand die 3 woanders. Also mein Fehler.

Besten Dank!
mf

Nachtrag: Gibt es noch die Möglichkeit den Punkt in 16.8 durch ein Komma zu ersetzen?
Exel macht da immer 16. August draus.

mf
Bitte warten ..
Mitglied: bastla
30.01.2009 um 21:07 Uhr
Hallo Mikefield!
Gibt es noch die Möglichkeit den Punkt in 16.8 durch ein Komma zu ersetzen?
Sollte so gehen:
set "Wert3=%Wert3:.=,%"
Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
31.01.2009 um 21:32 Uhr
Hat funktioniert, besten Dank!

Gruß
Mikefield
Bitte warten ..
Mitglied: Mikefield
28.02.2009 um 17:28 Uhr
Hallo Bastla!

Ich habe mal noch eine Frage zu den Zeilen 09 und 13.
In Zeile 09 steht !Zeile! in "", in Zeile 13 nicht. Wenn ich diese auch in "" setze funktioniert die weitere Verarbeitung nicht. So richtig will sich das mir nicht erschließen ...
Hängt das mit der Übergabe zusammen, da in ProcessLine3 keine For Schleife ist?

Herzlichst
mf
Bitte warten ..
Mitglied: bastla
28.02.2009 um 17:37 Uhr
Hallo Mikefield!

Die in Zeile 13 übergebene !Zeile! soll ja nicht als ein einziger Parameter (was die Folge ist, wenn Du sie unter Anführungszeichen setzt), sondern als eine Folge von, durch Leerzeichen getrennten, Parametern an das Unterprogramm übergeben werden.

Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
28.02.2009 um 17:44 Uhr
Hallo Bastla!

Habe es verstanden!

Danke
mf
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (15)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...