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

Zeilennummerierung einer Textdatei mittels Batch entfernen

Frage Entwicklung Batch & Shell

Mitglied: Shadow377

Shadow377 (Level 1) - Jetzt verbinden

17.07.2006, aktualisiert 18.07.2006, 8017 Aufrufe, 4 Kommentare

Hallo an allle
Bin neu hier im Forum und hoffe ihr könnt mir hier weiterhelfen..

Ich habe folgendes Problem: Ich muss von mehreren mehrzeiligen Textdateien (z.B. a.txt, b.txt) jeweils eine Zeile zufällig auswählen und ein eine neue Exceltabelle(c.xls) schreiben. Die Quelle für die Textdateien sind Eventlogs (Spalten Typ, Datum, Uhrzeit usw); sie sind durch Tabulatoren getrennt.

Meine Strategie zur Lösung des Problems war folgende:
Ich durchsuche die Dateien für die einzelnen Eventlogs mit findstr systematisch nach jedem Datum eines bestimmten Zeitraumes (beispielsweise 01.07.2006 bis 08.07.2006), schreibe alle Übereinstimmungen in eine eigene Textdatei (wären die oben genannten a.txt, b.txt usw). Dannach nummeriere ich mit findstr /n "^" die Zeilen der einzelnen Dateien durch und leite die Ausgabe in eine andere Datei (für a.txt z.B. a2.txt) um.
Dannach wird mit
Set /A "Counter=0"
FOR /F "delims=" %%A IN (a2.txt) DO SET /A "COUNTER+=1"

durchgezählt, wie viele Zeilen in der Datei a2.txt vorhanden sind, um anschließend mit %random% eine Zahl zu bestimmen; die übereinstimmende Zeilennummer wird dann wieder mit findstr überprüft und ausgegeben.

So weit, so gut; jetzt habe ich genau 1 Zeile pro Tag, die noch immer durch Tabulatoren getrennte Einträge besitzt und somit durch ändern der Extension von txt auf xls zu einer Excel-Tabelle wird.

Allerdings gibt es dabei folgendes Problem:
Die Zeile hat folgenden Aufbau:
Zeilennummer:Spalte1|tab|Spalte2|tab|Spalte3|....

Für das endgültige Resultat muss ich allerdings die Ausgabe OHNE Zeilennummer: erhalten. Ob die Zeilennummer 1, 2 oder auch 6- stellig ist, kann ich im vorhinein nicht sagen, daher ist es auch nicht möglich stur die ersten n-Stellen zu entfernen.
Mitglied: AxelHahn
17.07.2006 um 15:58 Uhr
Hallo,

die Zeilennummer wird doch immer mit ":" getrennt. Dann kannst du in deiner FOR-Schleife mit "tokens=1,2* delims=:" arbeiten.

for /F "tokens=1,2* delims=:" %%a in (Dateiname.txt) do echo %%b

Axel
Bitte warten ..
Mitglied: Shadow377
18.07.2006 um 08:23 Uhr
Danke für diese schnelle Antwort. Leider bin ich nicht so der Batchprofi und verstehe daher auch den Syntax nicht so ganz, wäre super wenn du ihn mir erklären könntest..

Ich habe die Zeile mal kopiert und ausprobiert; dabei habe ich allerdings leider festgestellt, dass die oben genannte Uhrzeit leider darunter leidet und nach den Stunden abgeschnitten wird (inklusive dem Rest der Zeile).
Beispiel: Statt "Durch Tabulatoren getrennte Einträge"|tab|17:20:37|tab|"weitere durch Tabulatoren getrennte Einträge" erhalte ich also nur noch folgende Ausgabe:
Einträge vor Datum|tab|17
Es wird somit die gesamte Zeile nach den Stunden abgeschnitten, das Problem ist allerdings, dass nur vor dem ersten : weggeschnitten werden darf (unabhängig von der Anzahl der Zeichen davor); die restlichen : müssen unbeeinflusst bleiben.
Es ist leider auch nicht sicher vorhersagbar, wie viele : in der Zeile enthalten sind..

Information zur Quelldatei: Sie ist derzeit schon so gefiltert, dass nur noch eine einzige Zeile (Zeilennummer:Zu verarbeitender Text)+einem Zeilenumbruch enthalten sind. Dies ist wohl nicht die optimalste Lösung (lieber wäre es mir, die Dateiausgabe schon bei findstr abzufangen, dann die Zeilennummer zu entfernen und dann erst in eine Datei zu schreiben, allerdings ist mir eine schnelle Lösung des Problems und ein nicht zu komplizierter Code wichtiger...

Ich bin übrigens draufgekommen, dass die folgende Zeile das Ergebnis nur in der cmd ausgiebt, nicht allerdings in eine Datei schreibt, war das beabsichtigt? Das Ergebnis brauche ich nämlich wieder in einer Datei.
Daher habe ich die Zeile wie folgt geändert:
for /F "tokens=1,2* delims=:" %%a in (Quelle.txt) do echo>>Ziel.txt %%b
Bitte warten ..
Mitglied: AxelHahn
18.07.2006 um 08:43 Uhr
Hallo,

wenn das mit der Uhrzeit nicht klappt ... da war doch ein kleiner Fehler. Bei Tokens gib 1* statt 1,2* an.


del output.txt 2>nul
for /F "tokens=1* delims=:" %%a in (datiename.txt) do echo %%b>>output.txt


Erklärung:
a) delims ist der Trenner in der Zeile.
b) tokens gibt an, welche Felder, die durch das (die) Trennzeichen entstehen, zurückgeliefert werden. Die Felder werden in den nächstfolgenden Buchstaben als Variablen abgelegt.

Beispiel:

for /F "tokens=1,4,5 delims=," %%m in (datiename.txt) do echo %%m .. %%n .. %%o

Bei einer Kommaseparierten Liste werden die Felder 1,4 und 5 gelesen. Innerhalb der For-Schleife sind sie als Variablen n, m und o greifbar (ab m hochzählend, weil %%m als Zählvariable angegeben ist).

c) Bei Tokens kann man auch - und * verwenden. Durch den Wert "1*" kann ich genau 2 Felder abgreifen: den Wert vor meinem Trenner und den ganzen Rest ab dem Trenner (unabh. ob das Trennzeichen noch einmal auftaucht oder nicht).

Das erklärte es auch noch einmal:

FOR /?



Schönen Tach noch!
Axel
Bitte warten ..
Mitglied: Shadow377
18.07.2006 um 08:54 Uhr
Super, hat geklappt, vielen Dank
Kompliment übrigens im Bezug auf die wirklich sehr kurzen Antwortzeiten und guten Beiträge. Ich muss sagen auch wenn ich in gewissem Maß damit gerechnet habe bin ich doch positiv überrascht und beeindruckt, dass die Antworten derart schnell kommen

Danke auch für die gute Erklärung
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Zeilenumbruch-Zeilen-Vorschub entfernen? (Batch) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: Textdatei Zeilenweise auslesen (2)

Frage von CreatorX zum Thema Batch & Shell ...

Batch & Shell
gelöst Bestimmte Zeile einer Textdatei mit Batch auslesen (2)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Neue Wissensbeiträge
Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(8)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Windows 10

Das Windows 10 Creators Update ist auf dem Weg

(6)

Anleitung von BassFishFox zum Thema Windows 10 ...

Heiß diskutierte Inhalte