marcushb
Goto Top

Teil aus Textfile auslesen und in neues Textfile speichern

Hallo liebes Forum,

ich bin auf der Suche nach einem kleinen Batch-Script für folgende Situation.

Ich lese via Script den Inhalt eines bestimmten FTP Verzeichnisses aus, und will aber ich brauche nicht den Inhalt der Subfolder.

Der Inhalt des Textfiles sieht wie folgt aus:


-rw-r----- 1 ftpxxxx ace 211495 Dec 2 07:21 049_pdf_20101201.zip

history:
total 80
-rw-r--r-- 1 ace ace 32636 Dec 1 15:45 049_1_i_20101201_759.txt
-rw-r--r-- 1 ace ace 4047 Dec 1 15:47 049_1_p_20101201_760.txt
-rw-r--r-- 1 ace ace 3061 Dec 1 15:19 DE1_CUST_20101201161904.XML


Ich möchte gerne alle Zeilen bis zur ersten Leerzeile auslesen und in ein neues TXT File schreiben.

Hat jemand zufällig eine IDee ?

Vielen Dank !

Gruß
Marcus

Content-Key: 156199

Url: https://administrator.de/contentid/156199

Printed on: April 20, 2024 at 01:04 o'clock

Mitglied: 60730
60730 Dec 02, 2010 at 11:08:00 (UTC)
Goto Top
moin,

demo für den cmd Prompt:

for /f "tokens=2,*" %a in (laufwerk:\pfad\text.txt) do echo %a %b>>Laufwerk:\pfad\output.txt

  • laufwerk:\pfad\ natürlich an deine Werte anpassen
  • dito mit den .txt

"nur" macht er das haargenauso - wie du es beschrieben hast - auch aus total 80 wird 80

Falls das nicht so sein soll und total die Ausnahme wäre, wo die zeile mit t beginnt:
for /f "eol=t tokens=2,*" %a in (laufwerk:\pfad\text.txt) do echo %a %b>>Laufwerk:\pfad\output.txt
(jede Zeile, die mit t beginnt - wird ignoriert)

Im anderen Fall, dass nur Zeilen die "r w ace" haben - würde es so laufen:
for /f "tokens=2,*" %a in ('"findstr "r w ace" "laufwerk:\pfad\text.txt"') do echo %a %b>>Laufwerk:\pfad\output.txt

Um testen alles hinter und incl. >> mal weglassen.

Alles weitere
for /?
in einer batch aus jedem einzelnen % ein doppeltes %% machen - sonst ist es so allein und auf einem Bein kann man nicht laufen


Gruß
Member: marcushb
marcushb Dec 02, 2010 at 11:16:09 (UTC)
Goto Top
Hi,

ich glaube da habe ich mich wohl etwas falsch ausgedrückt, ich möchte alles was über history steht auslesen und in ein neues File schreiben.Wenn ich dein Bsp. ausprobiere bekomme ich sozusagen "fast" alles in die neue Datei.

Gruß
Marcus
Member: Friemler
Friemler Dec 02, 2010 at 11:46:02 (UTC)
Goto Top
Hallo Marcus,

der folgende Code sollte Dein Problem lösen.
@echo off

setlocal enabledelayedexpansion

set "OutputEnd=0"  

type NUL>"Laufwerk:\pfad\output.txt"  

for /f "tokens=1,* delims=:" %%k in ('findstr /n $ "laufwerk:\pfad\text.txt"') do (  
  if "%%l" equ "" set "OutputEnd=1"  
  if !OutputEnd! equ 0 echo %%l>>"Laufwerk:\pfad\output.txt"  
)

endlocal
FINDSTR sucht nach Zeilen, die ein Zeilenende ($) enthalten (findet also alle Zeilen) und schreibt die Zeilennummern (wegen der Option /n) mit einem nachfolgenden Doppelpunkt vor den Zeileninhalt. FOR behandelt diesen Doppelpunkt als Trennzeichen, in %%k steht die Zeilennummer, in %%l der Zeileninhalt. Wenn %%l nichts enthält (Leerzeile gefunden), wird die Variable OutputEnd auf 1 gesetzt und somit die Ausgabe der nachfolgenden Zeilen in Skript-Zeile 11 unterbunden.

Gruß
Friemler
Member: Biber
Biber Dec 02, 2010 at 11:46:07 (UTC)
Goto Top
Moin marcushb,

zum Verarbeiten einer bestimmten (der ersten, der letzten, der 13ten..) Zeile einer Textdatei mit FOR/F-Anweisungen findest du einige Beispiele im Bereich Batch & Shell mit Hilfe der Suchfunktion.
Du kannst den ...DO..-Teil etwas aufbrezeln mit

FOR /F ... %i in (..) DO if not defined x (echo %i>neueDatei.txt) & set "x=leberkäse"

Grüße
Biber
Member: bastla
bastla Dec 02, 2010 at 15:47:46 (UTC)
Goto Top
@Friemler
FINDSTR sucht nach Zeilen, die ein Zeilenende ($) enthalten (findet also alle Zeilen)
... mit ev der Ausnahme der letzen Zeile (falls diese eben nicht mit einem CR und/oder LF endet) - da aber alle Zeilen jedenfalls einen Anfang haben:
for /f "tokens=1,* delims=:" %%k in ('findstr /n "^" "laufwerk:\pfad\text.txt"') do (
Anstelle der Zuweisung von "0" bzw "1" zur Variablen %OutputEnd% tendiere ich eher dazu, sie im "0"-Fall per
set "OutputEnd="
zu löschen, da sie so ohne "delayedExpansion" einfach per "if defined OutputEnd" abgefragt werden kann.

Grüße
bastla
Member: Friemler
Friemler Dec 02, 2010 at 15:58:53 (UTC)
Goto Top
@bastla
... mit ev der Ausnahme der letzen Zeile (falls diese eben nicht mit einem CR und/oder LF endet)
Stimmt, Vorsicht ist die Mutter der Porzellankiste. In diesem Fall aber vernachlässigbar, da der TO ja sowieso nur bis zur ersten Leerzeile ausgeben will. Außerdem ist die Textdatei ein Verzeichnislisting, das von einem Skript generiert wurde. Man kann also erwarten, dass auch die letzte Zeile mit CR/LF endet.

[Edit]
Da schreibt man eine Antwort und schon hat der Kerl noch eine sinnvolle Verbesserung gefunden face-wink ! Ich meine die Sache mit dem Löschen von OutputEnd, statt die Variable auf 0 zu setzen.

Gruß
Friemler
Member: bastla
bastla Dec 02, 2010 at 16:38:54 (UTC)
Goto Top
@Friemler
Du erklärst so schön, was Dein Batch macht - da wollte ich auch einmal etwas (und dann noch ein weiteres Etwas face-wink) beitragen ...

Grüße
bastla