pago159
Goto Top

Textzeile aus Datei Kopieren und sortieren

Hallo Kollegen,

ich bräuchte mal wieder eure Hilfe.

Folgende Ausgangssituation ist gegeben:

  • Testdokument.txt mit folgendem Inhalt:

Vorher:

xyz
abcd
defg
****** wurde gelöscht
sgbnj
jklöp
****** wurde gelöscht
( sind Zahlenfolgen, welche immer sechsstellig sind.)

Nachher:
****** wurde gelöscht
****** wurde gelöscht
****** wurde gelöscht

Benötigt:

  • Textdokument in dem nur die Gelöschten Dateien angegeben sind und nach Zahl aufsteigend sortiert.

Ich habe mir gedacht, dass das ganze per Batch machbar ist.

gedacht habe ich an:

findstr "
wurde gelöscht" %systemroot%\TestdokumentTEST.txt

Damit sollte doch eigentlich der String in das neue Textdokument Kopiert werden (Textdokument wird auf Batch gezogen)

Vielen Dank schonmal im vorraus
Grapper

Content-ID: 166459

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

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

bastla
bastla 17.05.2011 um 21:38:17 Uhr
Goto Top
Hallo Grapper!

Könntest Du das bitte mit einem "Vorher-Nachher"-Vergleich der Dateiinhalte (gerne auch mit ""-Formatierung) deutlicher darstellen? Derzeit kann ich Dir nicht (weit genug face-wink) folgen ...

[Edit] Danke, jetzt geht's face-wink[/Edit]

Grüße
bastla
bastla
bastla 17.05.2011 um 21:47:56 Uhr
Goto Top
... etwa so:
findstr /c:"wurde gel" %1|sort>%systemroot%\TestdokumentTEST.txt
- unter der Annahme, dass in "%systemroot%\TestdokumentTEST.txt" das Ergebnis stehen soll (und etwas abgekürzt, um ev Codierungsproblemen hinsichtlich des Umlautes vorzubeugen) ...

Grüße
bastla
Pago159
Pago159 17.05.2011 um 22:01:59 Uhr
Goto Top
Danke, das hört sich schonmal gut an,
werde das morgen direkt mal teste,
habe gerade die Datei nicht vor mir.

Hast du vll auch noch eine gute Seite,
mit der ich mich in die Batch Programmierung einarbeiten kann?
Werde dies wohl jetzt doch öfter benötigen, als gedacht.

Lg GRapper
ovu-p86
ovu-p86 18.05.2011, aktualisiert am 18.10.2012 um 18:46:55 Uhr
Goto Top
Hallo GRapper,


mir gehts ähnlich. Versuch mich auch gerade ins Batchen einzuarbeiten.
Bin noch nicht so lange hier dabei, aber ne Menge gelernt, gerade auch von den
Kommentaren unserer Batch-Spezies ( immer eine Anregung zur Repertoirerweiterung).

Ich weiß nicht, ob es eine alles erschlagende Abhandlung zum Batchen gibt.
ich hab das jetzt so gemacht:

- Hab mir mit Cuecards ( http://www.mhst.net/cuecards2/ ) ne kl. Datenbank in Baumstruktur mit den
wichtigsten Befehlen angelegt, wo ich einfach das Ergebnis von "Befehl /?" drin habe,
ggf. mit ergänzenden Kommentaren.

- außerdem hat mir sehr geholfen die Hilfe zum für mich effizientesten Batch-Befehl "For"
Tutorial zur FOR-Schleife
sowie die Abhandlung zu Variablen
Wie Arbeite ich mit Batch UmgebungsVariablen? Erstellung Umgang Erweiterungen Veränderungen

Für mich das schlimmste Kapitel sind die Leerzeichen in Pfaden, Dateinamen u.s.w., weil dann in den
Batches alles so unberechenbar wird.

- deshalb hab ich mir jetzt das Grundprinzip angewöhnt von Vornherein den Batch so anzulegen, daß
Leerzeichen erlaubt sind. Dann gewöhnt man sich dran und hat eine Fehlerquelle weniger. Zum Testen
baue ich deshalb immer gleich Verzeichnisse/Dateinamen etc. mit Leerzeichen. Dann ists auch
allgemeingültig.

Erstaunlich finde ich immer wieder was man so alles mit Batch/Cmd so machen kann.
Das sind meine bisherigen Erfahrungen. Dank nochmal an unsere Batch-Spezies.


Gruß

Uwe
Pago159
Pago159 18.05.2011 um 14:16:16 Uhr
Goto Top
@ Uwe:

Danke für die Links, werde mir das nachher mal schnell anschauen.

@ bastla:

Deine Zeile funktioniert super,
allerdings musste ich gerade feststellen, dass ich oben etwas Quatsch geschrieben habe:

kljbdakj asjdnkj ****** wurde gelöscht. dafds fsd
lakfopjkad ****** wurde gelöscht.
****** wurde gelöscht. sjah spdhfpuah 

kann leider auch in dem Dokument vorkommen.
Dann wird ja die ganze Zeile rausgezogen.

Ich benötige allerdings nur die stelle :

"++++++ wurde gelöscht"
gibt es da vll auch eine lösung für?

Danke nochmal im vorraus.

Lg Grapper
bastla
bastla 18.05.2011 um 14:21:31 Uhr
Goto Top
Hallo Grapper!

Riskier mal einen Blick in die Hilfe (findstr /?) - da stößt Du dann sicherlich auf zB "/e" ...

... oder was meinst Du mit der "Stelle"?

Grüße
bastla
Pago159
Pago159 18.05.2011 um 14:30:06 Uhr
Goto Top
Also bräuche ich um den String rauszubekommen /L
nur wird diese funktion auch die Zahl mitnehmen, da diese ja immer anders ist?
Dafür sind dann bestimmt die ...... da oder?

<EDIT>
Wenn ich allerdings die Platzhalter eintrage, dann wird der Text nicht mehr gefunden, bzw. das neue Textdokument bleibt leer.
Code ohne Plkatzhalter:

@echo
findstr /c:"wurde gelöscht." %1|sort>h:\TestdokumentTEST.txt  
Pause

Code mit Platzhalter:

@echo
findstr /c:"...... wurde gelöscht." %1|sort>h:\TestdokumentTEST.txt  
Pause

Alternativ habe ich es auch schon mit * versucht:

@echo
findstr /c:"****** wurde gelöscht." %1|sort>h:\TestdokumentTEST.txt  
Pause


</EDIT>
Lg GRapper
bastla
bastla 18.05.2011 um 14:47:45 Uhr
Goto Top
Hallo Grapper!

Ich weiß auch dieses Mal nicht, was Du genau meinst - in
kljbdakj asjdnkj ****** wurde gelöscht. dafds fsd
lakfopjkad ****** wurde gelöscht.
****** wurde gelöscht. sjah spdhfpuah 
gibt es schon keine Zeile, die zu
++++++ wurde gelöscht
passt.

Dann schreibst Du zwar immer wieder von "Zahlen", es kommen in Deinen Beispielen aber keine vor, und was Du letztendlich tatsächlich als Ergebnis haben möchtest, kann ich Deinen Ausführungen ebenfalls nicht exakt entnehmen - wie wäre es daher einmal mit einem "richtigen" "Vorher - Nachher"-Beispiel - meinetwegen mit veränderten / anonymisierten Daten, aber zumindest mit erkennbaren Strukturen ...

Und gleich noch vorweg: "findstr" findet Zeilen - eine weitere Zerlegung müsste dann auf andere Weise erfolgen.

Grüße
bastla
Pago159
Pago159 18.05.2011 um 14:54:12 Uhr
Goto Top
Ok, ich dachte dass "findstr" wirklich eine Textstelle finden kann.

also nochmal ganz genau:

Der Text schaut folgendermaßen aus:

Das medium 156156 wurde gelöscht.
mehrere läufe wurden verarbeitet, das meium 123123 wurde gelöscht

daraus wird der übersichthalber nur benötigt:
123123 wurde gelöscht
156156 wurde gelöscht

deswegen habe ich das ganze mit den Platzhaltern versucht, welche ja auch in der Hilfe /? angegeben werden.

Lg GRapper
bastla
bastla 18.05.2011 um 16:00:13 Uhr
Goto Top
Hallo Grapper!

Dann versuch das mal so:
@echo off & setlocal
set "Aus=TestdokumentTEST.txt"  
set "Such1=wurde"  
set "Such2=gelöscht"  

del "%Aus%" 2>nul  
for /f "delims=" %%i in ('findstr /c:"%Such1% %Such2%" %1') do call :ProcessLine %%i  
sort "%Aus%" /o "%Aus%"  
goto :eof

:ProcessLine
set "Nr="  
set "Gef="  
:Loop
if "%1"=="" goto :eof  
if %1==%Such1% (
    set "Gef=true"  
) else (
    echo %1|findstr /c:%Such2%>nul && (
        if defined Gef >>"%Aus%" echo %Nr% %Such1% %Such2%  
        set Gef=
    ) || (
        set "Nr=%1"  
    )
)
shift
goto :Loop
Damit sollten sogar mehrfach in einer Zeile vorhandene "###### wurde gelöscht" gefunden werden (wenn sie sauber durch Leerzeichen voneinander getrennt sind) ... face-wink

Grüße
bastla
Pago159
Pago159 18.05.2011 um 16:26:17 Uhr
Goto Top
Danke Bastla,
die Batch funktioniert super.

Sorry nochmal für meine Missverständliche ausdrucksweise.

Lg Grapper
Pago159
Pago159 20.05.2011 um 16:24:07 Uhr
Goto Top
Hey Batsla,

eine Frage Quält mich da dann doch noch!

Woher weis diese Batch Datei,
wo die Ausgabedatei hin soll?

Lg GRapper
bastla
bastla 20.05.2011 um 16:50:53 Uhr
Goto Top
Hallo Grapper!

Ich hätte natürlich nicht ganz so schreibfaul sein und die Variable %Aus% (siehe Zeile 2) auch %Ausgabe% nennen können ... face-wink

Grüße
bastla
Pago159
Pago159 20.05.2011 um 16:57:51 Uhr
Goto Top
set "Aus=TestdokumentTEST.txt"   

sagt der Batch aber doch nicht, wo diese Datei "TestdokumentTEST.txt" liegen soll, wenn sie nicht vorhanden ist,
diese Zeile gibt doch lediglich den Namen der Datei an oder sehe ich dies Falsch?

<Edit>
Kleiner Denkfehler von mir ;)
Mein Systemroot liegt gerade auf H:\
deshalb ist die Frage aufgekommen,
hat sich also von selbst geklärt

trotzdem Danke

</EDIT>
Lg Grapper
bastla
bastla 20.05.2011 um 17:03:52 Uhr
Goto Top
Hallo Grapper!

Nur der Ordnung halber: Natürlich kann nicht nur ein Name, sondern auch ein Pfad angegeben werden:
set "Aus=D:\Ein beliebiger Ordner\TestdokumentTEST.txt"
Grüße
bastla