8.6k Aufrufe
Gefragt in WindowsXP von romero Mitglied (323 Punkte)
hallo,

ne frage.wie kann ich den inhalt einer txt-datei umbenennen?

also es hat immer folgenden inhalt:

a123-44444-556-00 oder
a123-44440-557-00 oder
...

und soll so umbenannt werden,das es so am ende heißt:

a123_44444_556*
a123_44440_557*
...

hab zwar das mit ner FOR-schleife versucht bzw mit dem REN aber das macht er irgendwie nich so wie er will.

also (das ganze ist inner batchdatei):

FOR /F "tokens=1*" %%i IN (test.txt) DO REN *-*-*-* *_*_*

21 Antworten

0 Punkte
Beantwortet von batti-batch Einsteiger_in (81 Punkte)
Hallo alle zusammen,


bei dem hier geschilderten Problem ist es kein Suchen und Ersetzen, sondern das Herauslösen einer Tellzeichenkette und das Anfügen eines weiteren Zeichens:

Das Ganze lässt sich, wie wir gleich sehen werden, recht einfach lösen.

Die Einstellungen werden wie immer im SET-Block vorgenommen:

REM ************************ SET-Block Beginn ************************

REM Laufwerk, Pfad und Name der Quelldatei
SET "quell_datei=c:\test\rom_1.txt"

REM Laufwerk, Pfad und Name der Zieldatei
SET "ziel_datei=c:\test\rom_2.txt"

REM Anzuhaengendes Zeichen
SET "zeichen=*"

REM Laenge der Zeichenfolge
SET /a "laenge=14"

REM Zeichenkette soll ab
REM Zeichen Nr. %zeichen% uebernommen werden
SET /a "start_zeichen=0"

REM Zaehler fuer die Anzahl der Datensaetze
REM Diese Zuweisung nicht aendern
SET /a "zaehler=0"

REM ************************ SET-Block Ende **************************


Das Programm nimmt aus Sicherheitsgründen an der Quelldatei KEINE Änderungen vor; statt dessen werden die geänderten Datensätze in eine neue Datei geschrieben.
Das Programm ist einfach gehalten und bietet zahlreiche Möglichkeiten der Erweiterung (z.B: Auswertung usw.).

@ECHO off
SETLOCAL enabledelayedexpansion

CLS


REM Testprogramm
REM Zeichenketten einer Textdatei veraendern
REM und die Datensaetze in eine neue Datei schreiben
REM
REM https://supportnet.de/t/2227056
REM (c) batti-batch 04/2009
REM
REM getestet unter Windows 2000


REM ************************ SET-Block Beginn ************************

REM Laufwerk, Pfad und Name der Quelldatei
SET "quell_datei=c:\test\rom_1.txt"

REM Laufwerk, Pfad und Name der Zieldatei
SET "ziel_datei=c:\test\rom_2.txt"

REM Anzuhaengendes Zeichen
SET "zeichen=*"

REM Laenge der Zeichenfolge
SET /a "laenge=14"

REM Zeichenkette soll ab
REM Zeichen Nr. %zeichen% uebernommen werden
SET /a "start_zeichen=0"

REM Zaehler fuer die Anzahl der Datensaetze
REM Diese Zuweisung nicht aendern
SET /a "zaehler=0"

REM ************************ SET-Block Ende **************************


REM Falls die Zieldatei existiert, wird sie geloescht
IF EXIST "%ziel_datei%" DEL /f "%ziel_datei%" 1>NUL 2>NUL

FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (

SET "ziel_zeile=%%i"
SET "ziel_zeile=!ziel_zeile:~%start_zeichen%,%laenge%!%zeichen%"

ECHO !ziel_zeile!>>"%ziel_datei%"
SET /a "zaehler+=1"
)

ECHO.
ECHO.
ECHO Fertig^^!
ECHO.
ECHO Anzahl der Datensaetze: %zaehler%



Viel Spaß beim Testen.


Herzliche Grüße
batti-batch
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
freut mich das du wieder da bist batti.

darf doch dutzen oder? ;)

aber mit meinem teil funzt es auch wunderbar.

aber wenn wir gerade dabei sind:

das mit dem "umbenennen" hab ich ja hinbekommen.

nun müssen die einzelnen zeilen der text-datei ausgelesen werden und sortiert gesucht werden.sprich, der inhalt der txt-datei enthält datei-namen auf einem anderen laufwerk.

das ist der 1. schritt bzw der (nach meinem) 2. schritt.
da werden noch einige folgen...

lg romero
0 Punkte
Beantwortet von batti-batch Einsteiger_in (81 Punkte)
Hallo Romero,


zu Deinem Problem

und sortiert gesucht werden.sprich, der inhalt der txt-datei enthält datei-namen auf einem anderen laufwerk.


solltest Du vielleicht mal ein paar konkrete Beispiele geben...


Herzliche Grüße
batti-batch
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
also:

du hast mir ja schon in dem 1. prob mit den doppelbuchstaben sehr geholfen.das funktioniert einwandfrei.

nun zum 2. (aus meiner sicht) größeren problem:

es wurde eine excel-tabelle gezogen und sie als txt-datei abgespeichert.
nun soll diese umbenannt werden.das habe ich ja soweit auch hinbekommen.

und zwar mit dieser zeile in dem batch:

FOR /F "tokens=1,2,3,4 delims=-" %%i IN (test.txt) DO (
@ECHO %%i_%%j_%%k* >> test.txt
)


ziel ist es,das der inhalt umbenannt wird,von z.b.

F123-45678-009-00 -> F123_45678_009* (das * soll dann seiner "unterarten" symbolisieren)
F123-45670-010-00 -> F123_45670_010* usw...

es sind immer die stellen 15-17 die wegfallen bzw durch ein * ersetzt werden.warum dazu gleich.

nun ist aber das problem,das er die ausgangsdatei überschreibt,sondern das umbenannte einfach hinten dran hängt.
wie kann man das lösen?ne neue datei erstellen,die alte löschen und die neue umbenennen oder geht es auch temporär?

was hat das mit dem * aufsich:

nachdem es umbenannt worden ist soll eine schleife die txt auslesen,dann diese dateien auf ein bestimmtes laufwerk (bzw wenn es da nicht gefunden wird,dann auf ein anderes) suchen (diese F123_... sind dateien-namen).dabei wird aber jede gefundene datei in eine neue txt abgespeichert.wichtig:ALLE gefundenen dateien soll wie bisher in einer txt stehen (ähnlich wie mit dem befehl
DIR
.
da aber nicht alle dateien gebraucht werden bzw "ältere" umwichtig sind,sollen diese aus der txt gelöscht werden.diese sind gekennzeichnet mit einem großbuchstaben direkt an der 15. stelle:

F123_45678_009* -> F123_45678_009A*
-> F123_45678_009B*
F123_45670_010* -> F123_45670_010A*
-> F123_45670_010C*
-> F123_45670_010D* usw...

dabei sind nur die fettgedruckten wichtig.der rest soll also aus der datei fliegen (dabei ist aber egal wann sie erstellt wurden).

ich hoffe das ich das problem besser beschreiben konnte.und hoffe das nicht zuviel verlange.wegen mir kann das auch nach und nach eingebunden werden bzw mir ein ansatz gezeigt werden,wie ich es selber schreiben kann.also das mit dem suchen und in ne datei schreiben bzw das löschen einzelner "dateien".

lg romero
0 Punkte
Beantwortet von batti-batch Einsteiger_in (81 Punkte)
Hallo Romero,

das folgende Problem

nun ist aber das problem,das er die ausgangsdatei überschreibt,sondern das umbenannte einfach hinten dran hängt.
wie kann man das lösen?ne neue datei erstellen,die alte löschen und die neue umbenennen oder geht es auch temporär?

dürfte mit meinem Beispiel in Antwort 11 zu lösen sein.
Das dort beschriebene Programm erzeugt eine NEUE Datei; diese würde ich für das weitere Vorgehen heranziehen.

da aber nicht alle dateien gebraucht werden bzw "ältere" umwichtig sind,sollen diese aus der txt gelöscht werden.diese sind gekennzeichnet mit einem großbuchstaben direkt an der 15. stelle:

Das Entfernen von Datensätzen, die an der Position x einen Großbuchstaben enthalten, kann mit dem folgenden Programm erledigt werden:


@ECHO off
SETLOCAL enabledelayedexpansion

CLS

REM Testprogramm
REM Entfernen aller Eintraege aus einer *.txt-Datei,
REM die an der Position x einen Grossbuchstaben
REM enthalten

REM
REM https://supportnet.de/t/2227056
REM (c) batti-batch 04/2009
REM
REM getestet unter Windows 2000


REM ************************ SET-Block Beginn ************************

REM Laufwerk, Pfad und Name der Quelldatei
SET "quell_datei=c:\test\rom\rom_1.txt"

REM Laufwerk, Pfad und Name der Zieldatei
SET "ziel_datei=c:\test\rom\rom_2.txt"

REM Laufwerk, Pfad und Name der Tempdatei
SET "temp_datei=c:\test\rom\rom_temp.txt"


REM Zeichenposition
REM Zaehlung beginnt bei 0 (Null)
SET /a "zeichen_pos=14"


REM Zaehler fuer die Anzahl der Datensaetze
REM Diese Zuweisungen nicht aendern
SET /a "zaehler_1=0"
SET /a "zaehler_2=0"

REM ************************ SET-Block Ende **************************


REM Falls die Zieldatei existiert, wird sie geloescht
IF EXIST "%ziel_datei%" DEL /f "%ziel_datei%" 1>NUL 2>NUL

REM Falls die Tempdatei existiert, wird sie geloescht
IF EXIST "%temp_datei%" DEL /f "%temp_datei%" 1>NUL 2>NUL


FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET "temp_varia=%%i"
SET "temp_varia=!temp_varia:~%zeichen_pos%,1!"

REM Achtung:
REM Die Grossbuchstaben in dieser FOR-Schleife
REM muessen bis "Z" ergaenzt werden!
FOR %%a IN (A B C D) DO (
IF [%%a] EQU [!temp_varia!] (
ECHO %%i>>"%temp_datei%"
SET /a "zaehler_1+=1"
)
)

)

FOR /f "delims=" %%a IN ('FINDSTR . "%quell_datei%"') DO (
FINDSTR /c:"%%a" "%temp_datei%" 1>NUL || (
ECHO %%a>>"%ziel_datei%"
SET /a "zaehler_2+=1"
)
)

REM Tempdatei loeschen
IF EXIST "%temp_datei%" DEL /f "%temp_datei%" 1>NUL 2>NUL

REM Ausgabe der Ergebnisse
ECHO.
ECHO.
ECHO Fertig^^!
ECHO.
ECHO Die Zieldatei "%ziel_datei%" enthaelt %zaehler_2% Datensaetze.
ECHO.
ECHO Anzahl der entfernten Datensaetze: %zaehler_1%.
ECHO.
ECHO.


Die folgende Anmerkung im Programm solltest Du beachten:
Achtung:
Die Grossbuchstaben in dieser FOR-Schleife
muessen bis "Z" ergaenzt werden!
FOR %%a IN (A B C D) DO (

Der nächste Schritt wäre, die nunmehr in der Zieldatei aufgelisteten Dateien zu suchen.
Aber zunächst solltest Du das Programm ausgiebig testen.


Viel Spaß.

Herzliche Grüße

batti-batch
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
irgendwie ist es noch nicht das was ich brauche,sorry für die arbeit die du gemacht hast.also jedenfalls ist das was ich brauche nicht zustande gekommen.vllt bin ich ja auch zu blöd.

hab aber noch was vergessen:

am anfang soll die txt nach der nummer sortiert werden.in den meisten fällen ist das auch der fall,aber nicht immer.zudem wird dahinter (durch löeerzeichen getrennt) die anzahl angegeben,welche ich später auch brauch.

nun ist im normalfall so,das alles sortiert ist und die genaue anzahl besitzt.es kann aber auch vorkommen,das es eine nummer 2 oder mehrmals vorkommt,aber dahinter die anzahl 1 steht.das soll,wenn es geht,als erstes zusammengefasst werden:
also:

FALSCH:

F123-45670-010-00 1
F123-45670-010-00 1
F123-45670-010-00 1

RICHTIG:

F123-45670-010-00 3 -> F123_45670_010D_3.txt (das ist die richtige nummer die ich brauche).die nummer an sich,den buchstaben,welcher durch dieses besagte programm gefunden werden soll und deren anzahl.

also das wäre das was ich brauche... ;)
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
hab grad gemerkt,das ich das ein wenig falsch geschrieben hab.

da aber nicht alle dateien gebraucht werden bzw "ältere" umwichtig sind,sollen diese aus der txt gelöscht werden.diese sind gekennzeichnet mit einem großbuchstaben direkt an der 15. stelle:

F123_45678_009* -> F123_45678_009A*
-> F123_45678_009B*
F123_45670_010* -> F123_45670_010A*
-> F123_45670_010C*
-> F123_45670_010D* usw...


das schrieb ich.aber das war ein wenig falsch.
nicht die "älteren" sind durch einen buchstaben gekennzeichnet,sondern alle haben an der 15. stelle einen großbuchstaben.

und von den vielen dateien,welche auf einem bestimmten laufwerk zu finden sind,soll nur die nummer mit dem höchsten buchstaben in die txt geschrieben werden,welche auf dem laufwerk gefunden werden.
sollte mal eine nummer (bzw. datei) da nicht gefunden werden,soll er ein weiteres laufwerk durchsuchen.und wenn da nicht,dann soll er das in die txt bzw dann ausgeben,das diese dann fehlt.
0 Punkte
Beantwortet von batti-batch Einsteiger_in (81 Punkte)
Hallo Romero,


das von mir vorgestelle Programm erledigt das Entfernen von Datensätzen, die an der Position x einen Großbuchstaben enthalten.

irgendwie ist es noch nicht das was ich brauche


Du solltest Deine Wünsche (bezogen auf dieses eine Problem, also das Entfernen von Datensätzen, die an der Position x einen Großbuchstaben enthalten) nochmal genau beschreiben und nicht schon wieder das nächste Problem ins Spiel bringen, bevor das Vorherige gelöst ist.


Herzliche Grüße

batti-batch
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
ok du hast recht.erst das eine,dann das andere.

und es ist schwieriger für einen aussenstehenden,meine gedankengänge nachzuvollziehen,wenn ich sie nicht ausführlich darbiete.

nun werde ich es mal versuchen zu beschreiben:

als 1. werden viele TXT's erstellt,welche sich nur durch kleine merkmale (aber mit großer bedeutung) unterscheiden.

sie sehen dann so aus:

F123_45678_000A_10a.txt
F123_45678_000A_10b.txt
F123_45678_000A_10c.txt
F123_45678_000A_10d.txt
...

oder

F123_45678_000B_10a.txt
F123_45678_000B_10b.txt
F123_45678_000B_10c.txt
F123_45678_000B_10d.txt
...

die nummer ..._45678_... ist dabei das entscheidende.also daran wird alles festgemacht.

nun wird eine EXCEL-tab gezogen wo folgender inhalt drinsteht:

F123-45600-000-00 1
F123-45601-002-00 1
F123-45602-000-00 1
F123-45603-002-00 1
F123-45604-008-00 1
...

im vorderem teil ist die nummer,welche man vorher erstellt hat,zu finden F123-456000-000,das -00 soll wegfallen.die 1 soll die anzahl der jeweiligen nummer wiedergeben (wird später gebraucht,sollte aber nur bei größer 1 berücksichtigt werden).

soweit die entstehung.

nun soll der batch diese gezogene EXCEL-tab (eine Liste.txt) auslesen und verarbeiten.

diese nummern F123_45678_000A_10a.txt,... liegen entweder auf dem einem bzw auf den anderem laufwerk (z.b. C:\ oder D:\).

dieser batch soll nun die EXCEL-tab zeilenweise auslesen und die nummern entsprechend auf den einem oder anderem laufwerk suchen.dabei wird man feststellen,das es mehrere nummern gibt mit verschiedenen buchstaben an der 15. stelle.

F123_45678_000A_10a.txt
...
F123_45678_000B_10a.txt
...
F123_45678_000C_10a.txt
...
F123_45678_000D_10a.txt
...

nun soll aber nur die in eine neue Liste.txt kopiert werden,welche den höchsten buchstaben haben,sprich die nummer mit dem D (fettgedruckt),die anderen nicht (an der 15.stelle können sogar doppelbuchstaben stehen z.b AB)

mit dieser FOR-schleife zieht er alle die er darunter findet:

FOR /F "tokens=1,2,3,4,5* delims=-" %%a IN (Liste.txt) DO (
DIR /B C:\Ordner\%%a_%%b_%%c* >> neue_Liste.txt
)


da die nummer an sich erstmal von F123-45678-000-00 in F123_45678_000 umbenannt werden soll,habe ich das mit den tokens gewählt und sie sozusagen auseinander genommen.

nun wird auf dem laufwerk alle nummern gefunden und in diese "neue_Liste.txt" geschrieben.und genau da komme ich nicht weiter.wie kann ich sagen,das wenn er die nummer findet und an der besagten stelle ein A und ein B und ein C (und ...) dann soll er nur die nummer mit dem C nehmen.

hab schon mit einer 2. FOR-schleife versucht das prob zu lösen aber das klappt nicht:

FOR /F "tokens=1,2,3,4,5* delims=-" %%a IN (Liste.txt) DO (
DIR /B C:\Ordner\%%a_%%b_%%c*
FOR /L %%i IN (1,1,15) DO (
IF [%%i] EQU [15] IF [%%i] EQU [C] (
ECHO %%a_%%b_%%c%%i*>> neue_Liste.txt
)
)
)


hoffe nun das prob umfassend beschrieben zu haben.wenn fragen offen sind bitte schreiben.
0 Punkte
Beantwortet von batti-batch Einsteiger_in (81 Punkte)
Hallo Romero,


das solltest Du Dir nochmal genau überlegen:

an der 15.stelle können sogar doppelbuchstaben stehen z.b AB


Vielleicht meinst Du ja die 15. und die 16. Stelle, dann kann das mit einem Doppelbuchstaben klappen.

Es ergeben sich noch ein paar Fragen:

[*]Soll dieser Buchstabe an der 16. Stelle in die Sortierung mit einbezogen werden oder sind allein die Buchstaben an der 15. Stelle maßgebend?

[*]Wenn die Suche auf dem Laufwerk 1 erfolgreich war, soll dann trotzdem auf dem Laufwerk 2 gesucht werden?

[*]Was ist, wenn die Datei auf beiden Laufwerken gefunden wird?

[*]Wenn die Datei nicht gefunden wird, was soll dann passieren?

[*]Wo sollen die Fehler / Hinweise / sonstigen Ereignisse aufgelistet werden?

So viele Fragen.


Herzliche Grüße

batti-batch
...