Batch Datei soll aus Textdatei string auslesen ("genaue Koordinatenangabe")
Hallo,
ich habe ein Textdokument, ca. 50-100 Zeilen.
In der zB. 10. Zeile 50 Zeichen von links steht die Nummer (zB. 10 stellig),
(Hauptproblem: genaue Koordinaten der Nummer angeben),
diese soll als Variable gespeichert werden,
Ich weiss leider nicht wie ich an dieser Position lesen kann...
Kann mir da jemand helfen..
Gruß
Bonanza
ich habe ein Textdokument, ca. 50-100 Zeilen.
In der zB. 10. Zeile 50 Zeichen von links steht die Nummer (zB. 10 stellig),
(Hauptproblem: genaue Koordinaten der Nummer angeben),
diese soll als Variable gespeichert werden,
Ich weiss leider nicht wie ich an dieser Position lesen kann...
Kann mir da jemand helfen..
Gruß
Bonanza
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 42932
Url: https://administrator.de/contentid/42932
Ausgedruckt am: 08.11.2024 um 05:11 Uhr
63 Kommentare
Neuester Kommentar
Moin Bonanza,
ich weiß jetzt nicht genau, wo das Problem ist....
1.Die Zeile 10 in eine Variable packen
2. aus dieser Zeile vom 50sten Zeichen an 10 Zeichen lesen.
(Beispiel am CMD-Prompt):
Im Batch jeweils %%i statt %i am CMD-Prompt schreiben... that's all.
Gruß
Biber
ich weiß jetzt nicht genau, wo das Problem ist....
1.Die Zeile 10 in eine Variable packen
2. aus dieser Zeile vom 50sten Zeichen an 10 Zeichen lesen.
(Beispiel am CMD-Prompt):
(=16:42:34 F:\=)
>for /f "delims=" %i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%i"
(=16:42:49 F:\=)
>set ln
ln=10:16653300118.03970.01234.7001006000000008723+16653300000070061030BESFS010
>echo %ln:~52,10%
000000700
Im Batch jeweils %%i statt %i am CMD-Prompt schreiben... that's all.
Gruß
Biber
@miniversum
Eine "3" ist mir verlorengegangen beim Copy&Paste...*gg
Es kam natürlich zurück...
Wer achtet denn auf solche Kleinigkeiten... *gg
Thx
Biber
Eine "3" ist mir verlorengegangen beim Copy&Paste...*gg
Es kam natürlich zurück...
>echo %ln:~52,10%
3000000700
Wer achtet denn auf solche Kleinigkeiten... *gg
Thx
Biber
@miniversum
Also schrittweise...
Irgendwo liegt eine Textdatei rum.
In meinem Beispiel heißt die f:\Administrator\testklamauk.txt
Bei der FOR /F-Anweisung wie immer von innen nach außen lesen.
INNEN erste Aktion: findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt
---> suche mir in der Textdatei einen String, den es da höchst wahrscheinlich nicht gibt ("akjgriarg").
---> Zeige mir mit Zeilennummer alle Zeilen an, die diesen String nicht enthalten. Auch die Leerzeilen.
Denn es soll ja auch Zeile 10 ausgewertet werden, falls mal drei Leerzeilen mit drin sind.
INNEN zweite Aktion: ^|findstr "^10:"
> diesen ganzen Müll wieder an findstr.exe übergeben, diesmal mit der Bedingung: Nur die Zeile, in der am Zeilenanfang eine "10:" steht.
> das kann ja nur in Zeile 10 passieren. Selbst bei M$-Tools.
ZWISCHENERGEBNIS der INNEN-Aktionen:
Es wird an die ÄUSSERE FOR/F-Anweisung eine Zeile übergeben, die aus der Zeilennummer "10:" und der eigentlichen alten Zeile in der Datei besteht.
Diesen Output schreibe ich as is in die Variable ln ( ln für ausländisch line).
Und davon nehme ich die Zeichen ab Pos. 52 in Länge 10.
Eigentlich müsste ich ja ab Pos. 49 anfangen (das ist das 50ste Zeichen), aber ich habe ja vorweg noch die "10:", die Zeilennummer geschrieben.
So, jetzt noch mal versuchen, die zwei Zeilen zu lesen:
Gehts jetzt besser?
Gruß
Biber
Also schrittweise...
Irgendwo liegt eine Textdatei rum.
In meinem Beispiel heißt die f:\Administrator\testklamauk.txt
Bei der FOR /F-Anweisung wie immer von innen nach außen lesen.
INNEN erste Aktion: findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt
---> suche mir in der Textdatei einen String, den es da höchst wahrscheinlich nicht gibt ("akjgriarg").
---> Zeige mir mit Zeilennummer alle Zeilen an, die diesen String nicht enthalten. Auch die Leerzeilen.
Denn es soll ja auch Zeile 10 ausgewertet werden, falls mal drei Leerzeilen mit drin sind.
INNEN zweite Aktion: ^|findstr "^10:"
> diesen ganzen Müll wieder an findstr.exe übergeben, diesmal mit der Bedingung: Nur die Zeile, in der am Zeilenanfang eine "10:" steht.
> das kann ja nur in Zeile 10 passieren. Selbst bei M$-Tools.
ZWISCHENERGEBNIS der INNEN-Aktionen:
Es wird an die ÄUSSERE FOR/F-Anweisung eine Zeile übergeben, die aus der Zeilennummer "10:" und der eigentlichen alten Zeile in der Datei besteht.
Diesen Output schreibe ich as is in die Variable ln ( ln für ausländisch line).
Und davon nehme ich die Zeichen ab Pos. 52 in Länge 10.
Eigentlich müsste ich ja ab Pos. 49 anfangen (das ist das 50ste Zeichen), aber ich habe ja vorweg noch die "10:", die Zeilennummer geschrieben.
So, jetzt noch mal versuchen, die zwei Zeilen zu lesen:
>for /f "delims=" %i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%i"
>echo %ln:~52,10%
Gruß
Biber
Würds denn nicht auch über ne Zählvariable gehen, ähnlich dem Posting mit dem Abbrechen der Forschleife bei der 4. Zeile?
Nein, miniversum, genau das nicht.
Denn jede Leerzeile wird bei der FOR/F-Anweisung einfach übersprungen.
Hier mal der Vergleich an einem Beispiel (ein einfacher DIR-Befehl):
>(=19:56:14 F:\=)
>for /f "delims=" %i in ('dir *.log') do @set /a "x+=1" & @echo :%i
1: Datenträger in Laufwerk F: ist FlashPen
2: Volumeseriennummer: 0815-4711
3: Verzeichnis von F:\
4:21.06.2006 13:01 246 lordifm.log
5: 1 Datei(en) 246 Bytes
6: 0 Verzeichnis(se), 4.358.144 Bytes frei
>dir *.log|findstr /n /v "ksdahfals"
1: Datenträger in Laufwerk F: ist FlashPen
2: Volumeseriennummer: 0815-4711
3:
4: Verzeichnis von F:\
5:
6:21.06.2006 13:01 246 lordifm.log
7: 1 Datei(en) 246 Bytes
8: 0 Verzeichnis(se), 4.358.144 Bytes frei
In einer FOR /F-Anweisung komme ich nur auf 6 Zeilen; bei der FindStr-mimik auf 8 Zeilen.
Grüße
Biber
Hallo Bonanza!
Ist die Länge der Nummer ebenfalls gleich bleibend? Wenn ja (Annahme: 8 Stellen), wie von Biber oben gezeigt:
Wenn die Länge der Nummer unterschiedlich sein kann, muss das Ende durch ein Trennzeichen signalisiert werden (Annahme: #). Die Variante dafür sähe so aus:
Grüße
bastla
[Edit] Aus Gründen der Übersichtlichkeit zweites "Set" in eigene Zeile verfrachtet bzw Variante ergänzt[/Edit]
Ist die Länge der Nummer ebenfalls gleich bleibend? Wenn ja (Annahme: 8 Stellen), wie von Biber oben gezeigt:
for /f "delims=" %%i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%%i"
@Set "Nummer=%ln:~52,8%"
ren f:\Administrator\Test.txt %Nummer%.txt
Wenn die Länge der Nummer unterschiedlich sein kann, muss das Ende durch ein Trennzeichen signalisiert werden (Annahme: #). Die Variante dafür sähe so aus:
for /f "delims=" %%i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%%i"
for /f "delims=#" %%i in ('echo %ln:~52%') do set Nummer=%%i
ren f:\Administrator\Test.txt %Nummer%.txt
Grüße
bastla
[Edit] Aus Gründen der Übersichtlichkeit zweites "Set" in eigene Zeile verfrachtet bzw Variante ergänzt[/Edit]
@Biber,
es ist doch immer wieder erfrischend zu lesen, wie man mit BATch über verschlungene Umwege und (meist unlogische) Kommandos zum Ziel findet ...
kleiner Verbesserungsvorschlag beim findstr - statt nach einem definitiv nicht vorh. String zu suchen, ist es besser nach etwas zu suchen, was da ist:
findstr /N ". ^$"
Hier hat findstr 2 Suchstrings: gefunden werden die ein Zeichen enthalten oder eine Leerzeile. Reguläre Ausdrücke funktionieren ab NT4 aufwärts, aber nicht Win95/98 (ME weiss ich grad nicht).
Zum Testen:
dir | findstr /N ". ^$"
Viele Grüsse
-= Axel =-
es ist doch immer wieder erfrischend zu lesen, wie man mit BATch über verschlungene Umwege und (meist unlogische) Kommandos zum Ziel findet ...
kleiner Verbesserungsvorschlag beim findstr - statt nach einem definitiv nicht vorh. String zu suchen, ist es besser nach etwas zu suchen, was da ist:
findstr /N ". ^$"
Hier hat findstr 2 Suchstrings: gefunden werden die ein Zeichen enthalten oder eine Leerzeile. Reguläre Ausdrücke funktionieren ab NT4 aufwärts, aber nicht Win95/98 (ME weiss ich grad nicht).
Zum Testen:
dir | findstr /N ". ^$"
Viele Grüsse
-= Axel =-
@AxelHahn
Du hast natürlich Recht, Axel... ist a) richtiger und b) robuster mit der FindStr /N ". ^$"-Syntax.
Wenn sich dieser Thread so weiter entwickelt, dann muss ich den wohl demnächst zum Tutorial hochstufen.
Allerdings nähert sich der Sourcecode eines... na, ich sag mal liebevoll fortgeschrittenen Batches dann mehr und mehr der Les- und Wartbarkeit von Perl-Scripten an... an den so genannten Write-Only-Code.
Lesen kann den außer dem Autor keiner... *gg
Das ist jedenfalls eine eindeutige Gesetzmäßigkeit - je weniger Code-Zeilen und Zeichen verwendet werden, desto mehr Kommentarzeilen und Erläuterungen sind erforderlich.
Zur Veranschaulichung noch mal eine Variation des Schnipselchens oben...
Da ich es natürlich vermeiden würde, so etwas wie Pfade, Dateinamen oder Zeilennummern und Positionsangaben im Code fest zu verdrahten, wäre der für mich logische nächste Schritt,
einen universelleren Batch zu schreiben, der quasi wie eine Funktion arbeitet.
Sinngemäß also GetSubstrFromFile( dateiname, zeile, StartPos [, Länge]) mit einem Rückgabewert substr.
Gut, Funktionen und Rückgabewerte im eigentlichen Sinne gibt es zwar nicht im Batch, also wäre der erste Kompromiss ja, den Rückgabewert in einer Variablen namens %substr% (oder ähnlich) verfügbar zu machen.
Sobald ich also noch diese Features einbaue, wird der Batch ohne Kommentare kaum noch lesbar.
Ich zeig mal, was ich meine.. (ich lasse den Schnipsel mal demonstrativ unkommentiert).
Demo: (Variable %DebugMyBatches% hat den Wert "1")
Viele Grüße zurück
Biber
Du hast natürlich Recht, Axel... ist a) richtiger und b) robuster mit der FindStr /N ". ^$"-Syntax.
Wenn sich dieser Thread so weiter entwickelt, dann muss ich den wohl demnächst zum Tutorial hochstufen.
Allerdings nähert sich der Sourcecode eines... na, ich sag mal liebevoll fortgeschrittenen Batches dann mehr und mehr der Les- und Wartbarkeit von Perl-Scripten an... an den so genannten Write-Only-Code.
Lesen kann den außer dem Autor keiner... *gg
Das ist jedenfalls eine eindeutige Gesetzmäßigkeit - je weniger Code-Zeilen und Zeichen verwendet werden, desto mehr Kommentarzeilen und Erläuterungen sind erforderlich.
Zur Veranschaulichung noch mal eine Variation des Schnipselchens oben...
Da ich es natürlich vermeiden würde, so etwas wie Pfade, Dateinamen oder Zeilennummern und Positionsangaben im Code fest zu verdrahten, wäre der für mich logische nächste Schritt,
einen universelleren Batch zu schreiben, der quasi wie eine Funktion arbeitet.
Sinngemäß also GetSubstrFromFile( dateiname, zeile, StartPos [, Länge]) mit einem Rückgabewert substr.
Gut, Funktionen und Rückgabewerte im eigentlichen Sinne gibt es zwar nicht im Batch, also wäre der erste Kompromiss ja, den Rückgabewert in einer Variablen namens %substr% (oder ähnlich) verfügbar zu machen.
Sobald ich also noch diese Features einbaue, wird der Batch ohne Kommentare kaum noch lesbar.
Ich zeig mal, was ich meine.. (ich lasse den Schnipsel mal demonstrativ unkommentiert).
::------snipp GetSubstrFromFile.bat
@echo off & setlocal EnableDelayedExpansion
If [%1]== %0 /?
If [%3]== %0 /?
If [%1]==[/?] (echo Syntax: %~n0 Dateiname, Zeile, StartPos, [Länge]) & goto :eof
If [%4]== %0 %1 %2 %3 10
set /a "ln=%2" & Set /a "offset=1"
:again
Set /a "offset+=1" & set /a "ln/=10"
If %ln% gtr 0 goto again
Set /a "offset+=%3"
for /f "delims=" %%i in ('findstr /N ". ^$" "%1"^|findstr "^%2:"') do @Set "ln=%%i"
set "substr=!ln:~%offset%,%4!"
if defined DebugMyBatches Echo [Debug]Line: [%ln%]
if defined DebugMyBatches Echo [Debug]Pos(%3,%4): [%substr%] -- Gesetzt in der Variablen %%substr%%
endlocal & set "substr=%substr%" & if defined DebugMyBatches set substr
>f:\Administrator\GetSubstrFromFile.bat Beispiel.txt 11 34 14
[Debug]Line: [11: 1 Datei(en) 539.648 Bytes]
[Debug]Pos(34,14): [539.648 Bytes] -- Gesetzt in der Variablen %substr%
substr=539.648 Bytes
Viele Grüße zurück
Biber
Hallo Bonanza!
Gerne; kannst Du aber bitte vielleicht einmal so eine "Zeile 10" reinstellen bzw erklären, woran das Ende der "Zahl" erkannt wird (Leerstelle, spezielles Trennzeichen, keine folgende Ziffer mehr) und ob die Zahl auch ein Dezimalkomma oder eine Exponentendarstellung (7E+12) enthalten kann.
Grüße
bastla
Gerne; kannst Du aber bitte vielleicht einmal so eine "Zeile 10" reinstellen bzw erklären, woran das Ende der "Zahl" erkannt wird (Leerstelle, spezielles Trennzeichen, keine folgende Ziffer mehr) und ob die Zahl auch ein Dezimalkomma oder eine Exponentendarstellung (7E+12) enthalten kann.
Grüße
bastla
@Bonanza
...abgesehen von bastla's wiederholter Rückfrage:
die Formulierung des Problems kann ich auch schon mal machen.. *g
1. Von allen Text-Dateien auf Deinen Festplatte die richtige öffnen und alle anderen ignorieren.
2. Von allen Zeilen in dieser Textdatei nur die richtige Zeile betrachten und alle anderen ignorieren.
3. Von allen Zeichen in dieser Zeile nur die richtigen Zeichen betrachten und alle anderen ignorieren.
4. Ergebnis von Schritt 3 zurückgeben.
Beispiele zum zeilenweisen Lesen von Textdateien mit VBS und zur Mid()-Funktion findest Du tonnenweise im Forum.
Wenn Dir VBS leichter fällt, kannst Du doch mal Deinen Ansatz posten...
...abgesehen von bastla's wiederholter Rückfrage:
die Formulierung des Problems kann ich auch schon mal machen.. *g
1. Von allen Text-Dateien auf Deinen Festplatte die richtige öffnen und alle anderen ignorieren.
2. Von allen Zeilen in dieser Textdatei nur die richtige Zeile betrachten und alle anderen ignorieren.
3. Von allen Zeichen in dieser Zeile nur die richtigen Zeichen betrachten und alle anderen ignorieren.
4. Ergebnis von Schritt 3 zurückgeben.
Beispiele zum zeilenweisen Lesen von Textdateien mit VBS und zur Mid()-Funktion findest Du tonnenweise im Forum.
Wenn Dir VBS leichter fällt, kannst Du doch mal Deinen Ansatz posten...
... und
5. Die gefundene Zahl zum Umbennen einer Datei verwenden (s.o.)
Bis wir den entscheidenden Teil von 3. haben:
MitZahlUmbenennen.vbs
Aufruf:
Anmerkung: Fehlerüberprüfung und Übergabe weiterer Argumente bei Bedarf ...
Grüße
bastla
5. Die gefundene Zahl zum Umbennen einer Datei verwenden (s.o.)
Bis wir den entscheidenden Teil von 3. haben:
MitZahlUmbenennen.vbs
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl
sAlt = WScript.Arguments(1) 'umzubenennende Datei
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt
lLine = 10 'Zeilennummer für gesuchte Zahl
iPos = 50 'Position der gesuchten Zahl in der Zeile
'für die Varianten:
iLen = 8 'fixe Länge der Zahl
'oder
sDelim = "#" 'Trennzeichen (unmittelbar nach der Zahl)
'oder
sErlaubt = "0123456789,eE+-" 'erlaubte Bestandteile der Zahl
'Zeile lLine lesen
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDatei = fso.OpenTextFile(sDatei, 1)
For i = 1 to lLine
sLine = oDatei.ReadLine
Next
oDatei.Close
'Zeile kürzen
sLine = Mid(sLine, iPos)
'Zeile auswerten
sZahl = Left(sLine, iLen) 'fixe Länge
'oder
sZahl = Left(sLine, instr(sLine, sDelim) - 1) 'Trennzeichen
'oder
sZahl = "" 'für erlaubte Zeichen
i = 1
Do While Instr(sErlaubt, Mid(sLine, i, 1))
sZahl = sZahl & Mid(sLine, i, 1)
i = i + 1
Loop
'mit gefundener Zahl Umbenennung vornehmen
Set oDateiAlt = fso.GetFile(sAlt)
oDateiAlt.Name = sZahl & sNeuTyp
Aufruf:
CScript //nologo MitZahlUmbenennen.vbs DateiMitZahl.ext UmzubenennendeDatei.ext
Anmerkung: Fehlerüberprüfung und Übergabe weiterer Argumente bei Bedarf ...
Grüße
bastla
Hallo Bonanza!
Dann also als vorläufig endgültige Version
MitZahlUmbenennen.vbs
Aufruf:
Falls ich das weiter oben richtig verstanden habe, wolltest Du doch eine bestehende Datei umbenennen auf "Nummer.Typ" (machen jedenfalls die letzten beiden Zeilen des Scripts) ... Falls nicht, was soll mit der gefundenen Nummer weiter passieren?
Grüße
bastla
Dann also als vorläufig endgültige Version
MitZahlUmbenennen.vbs
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl
sAlt = WScript.Arguments(1) 'umzubenennende Datei
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt
lLine = 10 'Zeilennummer für gesuchte Zahl
iPos = 90 'Position der gesuchten Zahl in der Zeile
iLen = 9 'fixe Länge der Zahl
'Zeile lLine lesen
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDatei = fso.OpenTextFile(sDatei, 1)
For i = 1 to lLine
sLine = oDatei.ReadLine
Next
oDatei.Close
'Zeile kürzen
sLine = Mid(sLine, iPos)
'Zeile auswerten
sZahl = Left(sLine, iLen) 'fixe Länge
'mit gefundener Zahl Umbenennung vornehmen
Set oDateiAlt = fso.GetFile(sAlt)
oDateiAlt.Name = sZahl & sNeuTyp
Aufruf:
CScript //nologo MitZahlUmbenennen.vbs DateiMitZahl.ext UmzubenennendeDatei.ext
Falls ich das weiter oben richtig verstanden habe, wolltest Du doch eine bestehende Datei umbenennen auf "Nummer.Typ" (machen jedenfalls die letzten beiden Zeilen des Scripts) ... Falls nicht, was soll mit der gefundenen Nummer weiter passieren?
Grüße
bastla
So, dann die Kurzfassungsvariante von bastla's Vorlage zum Selber-Schönmachen:
Demo:
Gruß
Biber
[Edit] Uups, bastla war schon da.... [/edit]
' ReadFromFileLn10Pos90.vbs
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl
' sAlt = WScript.Arguments(1) 'umzubenennende Datei
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt
const lLine = 10 'Zeilennummer für gesuchte Zahl
const iPos = 90 'Position der gesuchten Zahl in der Zeile
'Zeile lLine lesen
Set fso = CreateObject("Scripting.FileSystemObject")
'----dies ist Zeile 10 .......................................................Pos. 90--->08154711
Set oDatei = fso.OpenTextFile(sDatei, 1)
For i = 1 to lLine-1
oDatei.ReadLine
Next
sLine = oDatei.ReadLine
oDatei.Close
set oDatei = nothing
set fso = nothing
'Zeile kürzen
sLine = RTrim(Mid(sLine, iPos))
Wscript.echo "Gefundener String: [" & sLine & "]"
'..... hier ggf die Umbenennerei ...
Demo:
>cscript //nologo f:\Administrator\ReadFromFileLn10Pos90.vbs f:\Administrator\ReadFromFileLn10Pos90.vbs
Gefundener String: [08154711]
Gruß
Biber
[Edit] Uups, bastla war schon da.... [/edit]
Hallo Bonanza!
Einfach etwas in der Art
an Stelle der Übernahme des ersten Arguments durch "WScript.Arguments(0)" eintragen ...
... oder eine Verknüpfung erstellen und die Datei(en) im Ziel mit angeben.
Als Variante 3 wäre dann noch Drag & Drop auf die .vbs zu nennen.
Grüße
bastla
Einfach etwas in der Art
sDatei = "C:\Neue Aufträge\AuszulesendeDaten.txt"
an Stelle der Übernahme des ersten Arguments durch "WScript.Arguments(0)" eintragen ...
... oder eine Verknüpfung erstellen und die Datei(en) im Ziel mit angeben.
Als Variante 3 wäre dann noch Drag & Drop auf die .vbs zu nennen.
Grüße
bastla
Also: wenn 707070.txt im Verzeichnis schon vorhanden dann nicht überschreiben...
sondern sich sinnvoll wie verhalten?
- Datei 707070[1].txt anlegen?
- gar nix anlegen und auch nix sagen?
- gar nix anlegen und Hinweis in ein Log schreiben?
- gar nix allein entscheiden und Benutzer interaktiv fragen?
- gar nix allein entscheiden und M$-BSOD aufrufen?
Sagt Dir der Bremer Ausdruck: "Wir essen aber zeitig..." etwas? *gg
RE: #2053 ...
Auch eine Art Rekorde zu brechen!
Psycho
@Biber
Schreibst mal den Code dafür rein - braucht man schließlich öfter
Grüße
bastla
- gar nix allein entscheiden und M$-BSOD aufrufen?
Schreibst mal den Code dafür rein - braucht man schließlich öfter
Grüße
bastla
Hallo Bonanza!
Für das Anlegen einer neuen Datei hätte ich folgenden Vorschlag: Ersetz die Zeile
durch
um an die Nummer auch Datum und Zeit anzuhängen - damit sollte es zu keinen weiteren Kollisionen kommen.
Grüße
bastla
Für das Anlegen einer neuen Datei hätte ich folgenden Vorschlag: Ersetz die Zeile
oDateiAlt.Name = sZahl & sNeuTyp
durch
If Not fso.FileExists(sZahl & sNeuTyp) Then
oDateiAlt.Name = sZahl & sNeuTyp
Else
oDateiAlt.Name = sZahl & "_" & Date & "_" & Replace(Time, ":", ".") & sNeuTyp
End If
um an die Nummer auch Datum und Zeit anzuhängen - damit sollte es zu keinen weiteren Kollisionen kommen.
Grüße
bastla
...oder, wenn ich dieses hier richtig verstanden habe...
...einfach den Else-Zweig ganz weglassen.
@bastla
Was mich wahnsinnig machen würde, sind Variablennamen wie "sZahl".
Die hätte ich unbedingt in "sBestellNr" umbenannt.
@Bonanza
Meinst Du, wir bekommen den Beitrag noch rechtzeitig zum Wochenende fertig beantwortet?
Grüße
Biber
wenn Datei schon vorhanden nicht überschreiben(ohne Benutzer zu fragen)
ansonsten neue Datei anlegen (was ja schon realisiert wurde)
ansonsten neue Datei anlegen (was ja schon realisiert wurde)
...einfach den Else-Zweig ganz weglassen.
@bastla
Was mich wahnsinnig machen würde, sind Variablennamen wie "sZahl".
Die hätte ich unbedingt in "sBestellNr" umbenannt.
@Bonanza
Meinst Du, wir bekommen den Beitrag noch rechtzeitig zum Wochenende fertig beantwortet?
Grüße
Biber
@Biber
Damit sich jeder gleich damit auskennt?
Grüße
bastla
Was mich wahnsinnig machen würde, sind Variablennamen wie "sZahl".
Die hätte ich unbedingt in "sBestellNr" umbenannt.
Die hätte ich unbedingt in "sBestellNr" umbenannt.
Damit sich jeder gleich damit auskennt?
Grüße
bastla
Hallo Marcel!
Der Pfad zur alten Datei muss noch beim Überprüfen / Löschen der neuen Datei berücksichtigt werden (beim Umbenennen war er nicht relevant, da für die alte Datei nur der Name, nicht aber der Speicherort, geändert wurde).
Neue (letzte?) Fassung:
sDatei = "O:\name.txt" 'Datei mit enthaltener Zahl
sAltPfad = "C:\Test2\" 'abschließenden Backslash beachten
sAltName = "rtdpur440101000.pdf" 'umzubenennende Datei
sNeuTyp = ".pdf" 'Dateityp der umbenannten Datei
lLine = 15 'Zeilennummer für gesuchte Zahl
iPos = 89 'Position der gesuchten Zahl in der Zeile
iLen = 7 'fixe Länge der Zahl
'Zeile lLine lesen
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDatei = fso.OpenTextFile(sDatei, 1)
For i = 1 to lLine
sLine = oDatei.ReadLine
Next
oDatei.Close
'Zeile kürzen
sLine = Mid(sLine, iPos)
'Zeile auswerten
sZahl = Left(sLine, iLen) 'fixe Länge
'mit gefundener Zahl Umbenennung vornehmen
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(sAltPfad & sZahl & sNeuTyp) Then
fso.DeleteFile(sAltPfad & sZahl & sNeuTyp)
Else
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName)
oDateiAlt.Name = sZahl & sNeuTyp
End If
fso.DeleteFile(sDatei)
Grüße
bastla
Der Pfad zur alten Datei muss noch beim Überprüfen / Löschen der neuen Datei berücksichtigt werden (beim Umbenennen war er nicht relevant, da für die alte Datei nur der Name, nicht aber der Speicherort, geändert wurde).
Neue (letzte?) Fassung:
sDatei = "O:\name.txt" 'Datei mit enthaltener Zahl
sAltPfad = "C:\Test2\" 'abschließenden Backslash beachten
sAltName = "rtdpur440101000.pdf" 'umzubenennende Datei
sNeuTyp = ".pdf" 'Dateityp der umbenannten Datei
lLine = 15 'Zeilennummer für gesuchte Zahl
iPos = 89 'Position der gesuchten Zahl in der Zeile
iLen = 7 'fixe Länge der Zahl
'Zeile lLine lesen
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDatei = fso.OpenTextFile(sDatei, 1)
For i = 1 to lLine
sLine = oDatei.ReadLine
Next
oDatei.Close
'Zeile kürzen
sLine = Mid(sLine, iPos)
'Zeile auswerten
sZahl = Left(sLine, iLen) 'fixe Länge
'mit gefundener Zahl Umbenennung vornehmen
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(sAltPfad & sZahl & sNeuTyp) Then
fso.DeleteFile(sAltPfad & sZahl & sNeuTyp)
Else
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName)
oDateiAlt.Name = sZahl & sNeuTyp
End If
fso.DeleteFile(sDatei)
Grüße
bastla
Moin bonanza,
Löschen dagegen tust Du mit explizit angegebenen absolutem Pfad.
Daher wird er die auch meistens nicht finden, nicht löschen und dementsprechend auf eine Mine laufen, wenn er die Datei in den gleichen Namen umbenennen soll.
Gruß
Biber
[Edit]....ja, montags vor dem ersten Kaffee bin ich langsamer... *grmpfff* [/Edit]
Eigentlich soll die IF-Abfrage den Laufzeitfehler abfangen, indem auf Existenz überprüft wird
Na ja, aber du überprüfst nur die Existenz vonIf fso.FileExists(sZahl & sNeuTyp) Then
... im aktuellen Pfad.... nicht aber (oder nur zufällig) im Pfad "C:\Test2\"Löschen dagegen tust Du mit explizit angegebenen absolutem Pfad.
Daher wird er die auch meistens nicht finden, nicht löschen und dementsprechend auf eine Mine laufen, wenn er die Datei in den gleichen Namen umbenennen soll.
Gruß
Biber
[Edit]....ja, montags vor dem ersten Kaffee bin ich langsamer... *grmpfff* [/Edit]
...und was wird nun aus dem Rekord?
Psycho
Psycho
@Bonanza
Was soll generell mit den entstandenen Dateien (egal ob kopiert oder umbenannt) weiter passieren?
Beim derzeitigen Stand der Dinge ist ja gar nicht sicher gestellt, dass überhaupt alle Bestellungen erfasst werden (bei schon vorhandener Bestellung mit einer Nummer, die in einer neu eingegangenen Bestellung enthalten ist, würdest Du die neue Bestellung ja einfach löschen).
Vielleicht überdenkst Du den ganzen Ablauf und legst die exakte Vorgangsweise für alle möglichen Fälle fest - bei der Umsetzung kann ich dann ja versuchen zu helfen.
Grüße
bastla
Was soll generell mit den entstandenen Dateien (egal ob kopiert oder umbenannt) weiter passieren?
Beim derzeitigen Stand der Dinge ist ja gar nicht sicher gestellt, dass überhaupt alle Bestellungen erfasst werden (bei schon vorhandener Bestellung mit einer Nummer, die in einer neu eingegangenen Bestellung enthalten ist, würdest Du die neue Bestellung ja einfach löschen).
Vielleicht überdenkst Du den ganzen Ablauf und legst die exakte Vorgangsweise für alle möglichen Fälle fest - bei der Umsetzung kann ich dann ja versuchen zu helfen.
Grüße
bastla
Hallo Bonanza!
Da es hier nur um Text zu gehen scheint, verweise ich nochmals auf meinen per VBA Daten (Wort) an bestimmter Stelle in PDF Dokument herauslesen im anderen Thread.
Grüße
bastla
Da es hier nur um Text zu gehen scheint, verweise ich nochmals auf meinen per VBA Daten (Wort) an bestimmter Stelle in PDF Dokument herauslesen im anderen Thread.
Grüße
bastla
Hallo Bonanza!
Es ergeben sich bei der Variante "Hinzufügen lfd Nummer" zumindest folgende weiteren Fragen:
Werden alte Versionen gelöscht?
Wenn ja, sollen dann frei gewordene laufende Nummern neu vergeben werden?
Sinnvoller wäre es vielleicht doch, einfach Datum und Zeit anzuhängen (dies am besten generell) - damit könnte die (unnötige) Verwaltung der laufenden Nummern entfallen.
Der letzte Teil des Codes sähe dann so aus (Datum und Zeit werden hier nur bei Bedarf hinzugefügt):
Grüße
bastla
Es ergeben sich bei der Variante "Hinzufügen lfd Nummer" zumindest folgende weiteren Fragen:
Werden alte Versionen gelöscht?
Wenn ja, sollen dann frei gewordene laufende Nummern neu vergeben werden?
Sinnvoller wäre es vielleicht doch, einfach Datum und Zeit anzuhängen (dies am besten generell) - damit könnte die (unnötige) Verwaltung der laufenden Nummern entfallen.
Der letzte Teil des Codes sähe dann so aus (Datum und Zeit werden hier nur bei Bedarf hinzugefügt):
'mit gefundener Zahl Umbenennung vornehmen
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName)
If fso.FileExists(sAltPfad & sZahl & sNeuTyp) Then
oDateiAlt.Name = sZahl & "_" & _
Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & _
Replace(Time, ":", ".") & _
sNeuTyp
Else
oDateiAlt.Name = sZahl & sNeuTyp
End If
fso.DeleteFile(sDatei)
Grüße
bastla
@Biber
... was ja witzlos wird, wenn es nur ein wenig Umbenennen sein sollte - dann doch gleich weiter per Batch.
Grüße
bastla
... was ja witzlos wird, wenn es nur ein wenig Umbenennen sein sollte - dann doch gleich weiter per Batch.
Grüße
bastla
Hallo Bonanza
Du machst das aber spannend - jetzt wissen wir noch gar nicht, ob nach der 7-stelligen Bestnr auch noch was kommt ...
Solange zumindest die 20 Blanks brav an Ihrem Platz bleiben, müsste folgendes Script (zur Abwechslung wieder mal komplett) funktionieren:
Grüße
bastla
[Edit] Fehlendes "Loop" ergänzt [/Edit]
Du machst das aber spannend - jetzt wissen wir noch gar nicht, ob nach der 7-stelligen Bestnr auch noch was kommt ...
Solange zumindest die 20 Blanks brav an Ihrem Platz bleiben, müsste folgendes Script (zur Abwechslung wieder mal komplett) funktionieren:
sDatei = "O:\name.txt" 'Datei mit enthaltener Zahl
sAltPfad = "C:\Test2\" 'abschließenden Backslash beachten
sAltName = "rtdpur440101000.pdf" 'umzubenennende Datei
sNeuTyp = ".pdf" 'Dateityp der umbenannten Datei
sSuchStr = "Unsere Best. :" 'Suchkriterium für Zeile / Position in Zeile
iLenSuchStr = Len(sSuchStr)
iLenBlanks = 20 'Anzahl der nach dem Suchkriterium auftretenden Blanks
iLenBestNr = 7 'fixe Länge der Bestellnr
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDatei = fso.OpenTextFile(sDatei, 1)
'(derzeit) erste Zeile mit enthaltenem Suchtext finden
Do While Not oDatei.AtEndOfStream
sLine = oDatei.ReadLine
iPos = Instr(sLine, sSuchStr)
If iPos > 0 Then
'Zeile auswerten
sBestNr = Mid(sLine, iPos + iLenSuchStr + iLenBlanks, iLenBestNr) 'fixe Länge
Exit Do 'nur eine BestNr verarbeiten
End If
Loop
oDatei.Close
'mit gefundener BestNr Umbenennung vornehmen
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName)
If fso.FileExists(sAltPfad & sBestNr & sNeuTyp) Then
oDateiAlt.Name = sBestNr & "_" & _
Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & _
Replace(Time, ":", ".") & _
sNeuTyp
Else
oDateiAlt.Name = sBestNr & sNeuTyp
End If
fso.DeleteFile(sDatei)
Grüße
bastla
[Edit] Fehlendes "Loop" ergänzt [/Edit]