bonanza
Goto Top

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

Content-ID: 42932

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

Ausgedruckt am: 08.11.2024 um 05:11 Uhr

Biber
Biber 24.10.2006 um 16:52:02 Uhr
Goto Top
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):
(=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
miniversum 24.10.2006 um 16:58:14 Uhr
Goto Top
hihi das sind 9 Zeichen keine 10 :p

miniversum
Biber
Biber 24.10.2006 um 17:05:44 Uhr
Goto Top
face-wink @miniversum

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
miniversum 24.10.2006 um 18:08:29 Uhr
Goto Top
ich
hihi face-wink

Aber die For-Schleife versteh ich nicht so ganz..... Erklär mal bitte.

miniversum
Biber
Biber 24.10.2006 um 18:35:30 Uhr
Goto Top
@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:
>for /f "delims=" %i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%i"  
>echo %ln:~52,10%
Gehts jetzt besser?

Gruß
Biber
miniversum
miniversum 24.10.2006 um 19:45:07 Uhr
Goto Top
Ok jetzt machts Sinn. Hatte mit dem Grund für das
findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt
ein Problem.
Würds denn nicht auch über ne Zählvariable gehen, ähnlich dem Posting mit dem Abbrechen der Forschleife bei der 4. Zeile?

miniversum
Biber
Biber 24.10.2006 um 19:59:21 Uhr
Goto Top
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
miniversum
miniversum 24.10.2006 um 21:27:11 Uhr
Goto Top
ok verstanden.
Danke

miniversum
Bonanza
Bonanza 25.10.2006 um 07:55:21 Uhr
Goto Top
Hallo

danke für die Antworten,
nur:

In Zeile 10 soll an 50. Stelle eine Nummer eingelesen werden zB. "74365190".
Diese Stelle ist statisch (Nummer steht in jedem Dokument an fester Stelle)

Diese soll als Variable gespeichert werden.
Mit dieser soll eine Datei umbenannt werden.

Gruß
Bonanza
bastla
bastla 25.10.2006 um 15:15:00 Uhr
Goto Top
Hallo Bonanza!

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]
AxelHahn
AxelHahn 26.10.2006 um 09:19:47 Uhr
Goto Top
@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 =-
Biber
Biber 26.10.2006 um 11:13:52 Uhr
Goto Top
@AxelHahn
face-big-smile

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  
Demo: (Variable %DebugMyBatches% hat den Wert "1")
>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
Bonanza
Bonanza 26.10.2006 um 11:53:27 Uhr
Goto Top
Danke für die umfangreiche Lösung...!!

Inzwischen habe ich festgestellt, das es schöner wäre,
dieses Problem in VBS zu vormulieren.

Vielleicht weiss da jemand etwas

Gruß
Bonanza
bastla
bastla 26.10.2006 um 12:01:25 Uhr
Goto Top
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
Biber
Biber 26.10.2006 um 12:48:52 Uhr
Goto Top
@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...
bastla
bastla 26.10.2006 um 12:59:48 Uhr
Goto Top
... und

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
Bonanza
Bonanza 26.10.2006 um 13:03:12 Uhr
Goto Top
Hallo

So sieht meine Zeile 10 aus:


" Bstellnr: 099023445 "
(Zwischen Zeilenanfang und Bestellnummer ca. 50 Blanks und vor der benötigten Nummer auch etwa 20 Blanks)

Gruß
Bonanza
bastla
bastla 26.10.2006 um 13:09:57 Uhr
Goto Top
Hallo Bonanza!

Wenn es ca. 50 Zeichen sind kann man sich auf die Position nicht verlassen. Nach Deinem Beispiel müsste es eigentlich so sein: Such die nach dem Text "Bstellnr: " folgende Zahl (Ende der Zahl = Leerstelle - richtig?

Grüße
bastla
Bonanza
Bonanza 26.10.2006 um 13:17:00 Uhr
Goto Top
Sorry falsch formuliert...

natürlich bestimmte Anzahl Blanks ( ab Zeilenanfang 50, vor Nummer 20 !)

(Nummer steht immer an fester Stelle)

Gruß
Bonanza
bastla
bastla 26.10.2006 um 13:23:08 Uhr
Goto Top
Hallo Bonanza!

Jetzt kenne ich mich aber nicht mehr aus:

Steht die Nummer an Position 51 (nach 50 Blanks) der Zeile oder an Position 71?
Gibt es ein Kriterium, an dem ich das Ende der Nummer erkenne oder hat diese eine fixe Länge?

Grüße
bastla
Biber
Biber 26.10.2006 um 13:29:24 Uhr
Goto Top
....wenn in dieser Zeile wirklich immer [mind. 10 Leerzeichen +"Bestellnr:" + mind. 10 Leerzeichen] als mögliches Such-Kriterium steht, dann wäre es nur eine Batch-Zeile...
Bonanza
Bonanza 26.10.2006 um 13:29:31 Uhr
Goto Top
Hehe, oK dann mal anders:

Mir ist im Textfile die Zeilennummer bekannt (Z. 10),

ich weiß auch, das die besuchte Nummer ( 9 stellig) an der Position 90 in der Zeile 10 steht.

Also: Feste Position der Nummer


Gruß
Bonanza
Bonanza
Bonanza 26.10.2006 um 13:35:19 Uhr
Goto Top
klar,
habe ich auch schon getestet,

da ich aber möglicherweise weitere Funktionen bzw. Schleifen einbauen möchte,
wäre es komfortabler dies in VB zu schreiben.


Gruß
Bonanza
8644
8644 26.10.2006 um 13:40:26 Uhr
Goto Top
@Biber und bastla:

Trägt zwar in keinster Weise zur Lösung bei, aber ich bewundere eure Engelsgeduld!
Oder täuscht das und eure Tastaturen haben schon tiefe Bisswunden?

@Bonanza:

Nix für ungut!

Psycho
Bonanza
Bonanza 26.10.2006 um 14:35:32 Uhr
Goto Top
Ich weiß eure Geduld auch zu schätzen...

kann mir da jemand doch noch helfen ?


Gruß
Bonanza
bastla
bastla 26.10.2006 um 14:54:44 Uhr
Goto Top
Hallo Bonanza!

Dann also als vorläufig endgültige Version face-wink

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
bastla
bastla 26.10.2006 um 14:58:22 Uhr
Goto Top
@psycho

Aber nein, das wird einfach ein Rekordversuch face-smile

Grüße
bastla
Biber
Biber 26.10.2006 um 15:05:23 Uhr
Goto Top
So, dann die Kurzfassungsvariante von bastla's Vorlage zum Selber-Schönmachen:

' 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]
Bonanza
Bonanza 26.10.2006 um 15:40:12 Uhr
Goto Top
Ich danke euch recht herzlich,

(meine kleine Frage als VB Neuling):


kann ich in dieses Script keinen direkten Pfad der Textdatei hinterlegen,
bzw. die Pfade die in der Konsole ubergeben werden?

Dieses Script soll automatisch ausgeführt werden

Gruß
Bonanza
bastla
bastla 26.10.2006 um 16:02:36 Uhr
Goto Top
Hallo Bonanza!

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
Bonanza
Bonanza 26.10.2006 um 16:52:49 Uhr
Goto Top
Super!!

Danke,danke an alle die mir geholfen haben...

funktioniert top!!

Eins noch:

Kann man da eine Routine einbauen,
die feststellt, ob die neue Datei (mit neuem Dateinamen)schon besteht
und ggf. dann nicht überschreibt?

Also: wenn 707070.txt im Verzeichnis schon vorhanden dann nicht überschreiben...

Gruß
Bonanza
Biber
Biber 26.10.2006 um 17:08:25 Uhr
Goto Top
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
8644
8644 26.10.2006 um 17:13:22 Uhr
Goto Top
RE: #2053 ...

Auch eine Art Rekorde zu brechen! face-big-smile

Psycho
bastla
bastla 26.10.2006 um 17:32:03 Uhr
Goto Top
@Biber

- gar nix allein entscheiden und M$-BSOD aufrufen?

Schreibst mal den Code dafür rein - braucht man schließlich öfter face-wink

Grüße
bastla
Bonanza
Bonanza 27.10.2006 um 07:50:19 Uhr
Goto Top
Guten Morgen,

Ich habe mir es so gedach
Alles soll im Hintergrund ablaufen, d.h. wenn Datei schon vorhanden nicht überschreiben
(ohne Benutzer zu fragen) ansonsten neue Datei anlegen (was ja schon realisiert wurde)

Gruß
Bonanza
bastla
bastla 27.10.2006 um 09:38:09 Uhr
Goto Top
Hallo Bonanza!

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
Biber
Biber 27.10.2006 um 09:48:15 Uhr
Goto Top
...oder, wenn ich dieses hier richtig verstanden habe...
wenn Datei schon vorhanden nicht überschreiben(ohne Benutzer zu fragen)
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". face-wink
Die hätte ich unbedingt in "sBestellNr" umbenannt.

@Bonanza
Meinst Du, wir bekommen den Beitrag noch rechtzeitig zum Wochenende fertig beantwortet?

Grüße
Biber
Bonanza
Bonanza 27.10.2006 um 09:49:34 Uhr
Goto Top
Hehe!!
Danke euch allen...

Ich denke Ihr habt das WE wohlverdient ;)

Schönen Tag

Bonanza
bastla
bastla 27.10.2006 um 10:42:52 Uhr
Goto Top
@Biber

Was mich wahnsinnig machen würde, sind Variablennamen wie "sZahl". face-wink
Die hätte ich unbedingt in "sBestellNr" umbenannt.

Damit sich jeder gleich damit auskennt? face-wink

Grüße
bastla
Bonanza
Bonanza 30.10.2006 um 09:08:08 Uhr
Goto Top
Hallo zusammen,

Ich habe ein am WE ein bisschen am Quellcode experimentiert, es kam aber immer die gleiche Fehlermeldung:
( Nur wenn die Datei bereits vorhanden ist!)


Zeile: 44 (= oDateiAlt.Name = sZahl & sNeuTyp)
Fehler : Die Datei ist schon vorhanden
Code : 800A003A
Quelle : Laufzeitfehler in MS VBScript


Hier der Code:

sDatei = "O:\name.txt" 'Datei mit enthaltener Zahl
sAlt = "C:\Test2\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

'MsgBox szahl


'mit gefundener Zahl Umbenennung vornehmen
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

If fso.FileExists(sZahl & sNeuTyp) Then

fso.DeleteFile("C:\Test2\rtdpur440101000.pdf")
Else

Set oDateiAlt = fso.GetFile(sAlt)
oDateiAlt.Name = sZahl & sNeuTyp

End If

fso.DeleteFile("O:\name.txt")


Hoffentlich findet Ihr den Fehler...
(Eigentlich soll die IF-Abfrage den Laufzeitfehler abfangen, indem auf Existenz überprüft wird)


Gruß
Marcel
bastla
bastla 30.10.2006 um 09:24:59 Uhr
Goto Top
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
Biber
Biber 30.10.2006 um 09:25:23 Uhr
Goto Top
Moin bonanza,
Eigentlich soll die IF-Abfrage den Laufzeitfehler abfangen, indem auf Existenz überprüft wird
Na ja, aber du überprüfst nur die Existenz von
If 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]
Bonanza
Bonanza 30.10.2006 um 10:15:09 Uhr
Goto Top
ok habs mal getestet

Jetzt wird die alte erzeugte Datei überschrieben mit der neuen Datei namens "rtdpur440101000.pdf"

mein Ziel: Die alte erzeugte Datei soll, wenn eine neue Datei geschrieben wird
"rtdpur440101000.pdf" nicht überschrieben werden,
und "rtdpur440101000.pdf" soll gelöscht werden.

Gruß
Marcel
bastla
bastla 30.10.2006 um 13:49:51 Uhr
Goto Top
Hallo Marcel!

Dann also statt
fso.DeleteFile(sAltPfad & sZahl & sNeuTyp)

fso.DeleteFile(sAltPfad & sAltName)

mit dem Effekt, dass dann eine unter dem neuen Namen bereits vorhandene Datei erhalten bleibt und die umzubenennende Datei gelöscht wird.

Grüße
bastla
Bonanza
Bonanza 30.10.2006 um 13:50:44 Uhr
Goto Top
Hallo nochmal,

Ich habe bemerkt, dass in meinem Textdokument mehrere Bestellungen vorkommen,
d.h. mehrere Bestellnummern zum auslesen (statt ursprünglich nur einer)

Da die Zeilenposition deshalb variiert müsste ich mit einem Suchwort dieses Textdokument abarbeiten.

So sieht meine Zeile mit der gesuchten Bestellnr aus:

*50 Zeichen Blank*Unsere Best. : *20 Zeichen Blank*9704023

So meine Frage:

Ist es möglich einen Suchstring zu definieren (zB mit "Unsere Best.:")
der die Textdatei durchsucht.
Wenn diese Zeichenfolge gefunden, dann 20 Positionen nach rechts, 7 Positionen einlesen in Variable.

Natürlich kann das in einer Textdatei mehrmals vorkommen (bis zu 10x)
deshalb sollten die Nummern dynamisch eingelesen werden.

Ich hoffe mein Problem wurde einigermaßen klar geschildert.

danke euch schonmal

Gruß
Bonanza
bastla
bastla 30.10.2006 um 13:54:14 Uhr
Goto Top
Hallo Bonanza!

Bis jetzt gab es eine Datei, die anhand der Bestellnummer umbenannt oder, siehe oben, gelöscht wurde (bei bereits vorhandener "Zieldatei").

Was sollte daher mit den mehreren gefundenen Bestellnummern passieren?

Grüße
bastla
Bonanza
Bonanza 30.10.2006 um 14:03:15 Uhr
Goto Top
gute Frage...
Ich habe noch keinen geeigneten Lösungsansatz.

Es wird ein PDF Dokument erzeugt mit 1-10 enthaltenen Bestellungen
Die Nummer der ersten Best. wird der Name des PDF-Dokuments.

Am besten wäre eine Teilung des PDF Dokuments (zB 3 Bestellungen in pdf -> 3 Teile + jeweilige Dateinamensänderung)

Oder vielleicht die alle vorhandenen Bestellnummern in Dateinamen...
Was bei 10 versch. Nummer jeweils 7stellig nen ganz schön langen Namen ergibt.

Gruß
Bonanza
Biber
Biber 30.10.2006 um 14:09:09 Uhr
Goto Top
Biber<----..wird sich jetzt eher die Zunge abbeißen, bevor er nochmal irgendeine Zeile mit FOR/F und FindStr /C:"................Unsere Best.:................." wie Sauerbier anbietet...
Bonanza
Bonanza 30.10.2006 um 14:10:29 Uhr
Goto Top
???
bastla
bastla 30.10.2006 um 14:12:21 Uhr
Goto Top
@Biber

Kannst doch jetzt nicht aufgeben, wo wir's gerade so lustig haben! face-smile

Grüße
bastla
8644
8644 30.10.2006 um 14:18:38 Uhr
Goto Top
...und was wird nun aus dem Rekord?

Psycho
bastla
bastla 30.10.2006 um 14:20:41 Uhr
Goto Top
@psycho

Wir wollen doch keinen für alle Ewigkeiten aufstellen ... face-wink

Grüße
bastla
bastla
bastla 30.10.2006 um 14:23:45 Uhr
Goto Top
@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
Bonanza
Bonanza 30.10.2006, aktualisiert am 18.10.2012 um 17:57:23 Uhr
Goto Top
ok werde mir die Sache genauer überlegen...(melde mich dann wieder)


Nebenfrage:
Ist es möglich aus PDF zu lesen (wahrscheinlich nur mit Acrobat Accessm Lib)
Habt Ihr da Erfahrung?....habe da absolut nichts im Forum gefunden außer
den Verweis auf die Objektbibliothek mit der Syntax (in Excel).

Die mir leider überhaupt nichts sagt

per VBA Daten (Wort) an bestimmter Stelle in PDF Dokument herauslesen

Gruß
Bonanza
bastla
bastla 30.10.2006 um 15:15:37 Uhr
Goto Top
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
Bonanza
Bonanza 30.10.2006 um 15:22:15 Uhr
Goto Top
ich arbeite schon mit PDF Creator

rtdpur440101000.bpf Datei ( im ASCII Format) wird an PDF Creator übergeben und dieser konvertiert zu rtdpur440101000.pdf

gleichzeitig wird txt.dokument erstellt, aus der Bestellnr. gelesen wird.


Noch eine Frage zum oberen Lösungs Code

Wir sind ja davon ausgegangen, das eine neu erzeugte Datei, die den gleichen Namen trägt, die alte Datei nicht überschreibt.
Es wäre doch bestimmt möglich zwecks Historie die neu erstellten mit einer Zahlenfolge zu versehen zB. 9649004_2.pdf für die zweite Version der erzeugten Datei
9649004_3.pdf für die dritte Version....

also nach Nummer die Endung "_" + fortlaufende Nummer


Gruß
Bonanza

Bonanza
bastla
bastla 31.10.2006 um 00:38:25 Uhr
Goto Top
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):
'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
Bonanza
Bonanza 31.10.2006 um 10:30:33 Uhr
Goto Top
Danke

habe diese Sache mit eingebaut..

Jetzt habe ich ein neues Problem aufgedeckt:

Die Zeile der Bestellnummer kann sich ändern (mist!!)


So sieht meine Zeile mit der gesuchten Bestellnr aus:

*50 Zeichen Blank*Unsere Best. : *20 Zeichen Blank*9704023

So meine Frage:

Ist es möglich einen Suchstring zu definieren (zB mit "Unsere Best.:")
der die Textdatei durchsucht.
Wenn diese Zeichenfolge gefunden, dann 20 Positionen nach rechts, 7 Positionen einlesen in Variable.

Gruß
Bonanza
Biber
Biber 31.10.2006 um 10:43:33 Uhr
Goto Top
...ich könnte ja mit FOR/F und FindStr /C:"................Unsere Best.:................." einen Parameter WScript.Arguments(0) für bastla's Schnipsel erzeugen..
bastla
bastla 31.10.2006 um 10:48:46 Uhr
Goto Top
@Biber

... was ja witzlos wird, wenn es nur ein wenig Umbenennen sein sollte - dann doch gleich weiter per Batch.

Grüße
bastla
bastla
bastla 31.10.2006 um 11:10:34 Uhr
Goto Top
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:
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]
Bonanza
Bonanza 31.10.2006 um 13:41:48 Uhr
Goto Top
@bastla

Wow, gute Arbeit...

ich habe den Code mal 1 zu 1 übernommen, um diesen zu testen.

Es wird allerdings nur eine rtdpur440101000.pdf Datei geschrieben und ein
Fehlerfenster poppt auf.

Zeile: 36
Zeichen: 23
(Position letzes Zeichen Quellcode!)
Fehler: 'Loop' erwartet


Gruß
Bonanza
bastla
bastla 31.10.2006 um 13:52:18 Uhr
Goto Top
Hallo Bonanza!

"Loop" ist jetzt da.

Grüße
bastla