Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch Datei soll aus Textdatei string auslesen ("genaue Koordinatenangabe")

Frage Entwicklung Batch & Shell

Mitglied: Bonanza

Bonanza (Level 1) - Jetzt verbinden

24.10.2006, aktualisiert 18.10.2012, 36456 Aufrufe, 63 Kommentare

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
63 Antworten
Mitglied: Biber
24.10.2006 um 16:52 Uhr
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):
01.
(=16:42:34  F:\=) 
02.
>for /f "delims=" %i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%i" 
03.
(=16:42:49  F:\=) 
04.
>set ln 
05.
ln=10:16653300118.03970.01234.7001006000000008723+16653300000070061030BESFS010 
06.
>echo %ln:~52,10% 
07.
000000700
Im Batch jeweils %%i statt %i am CMD-Prompt schreiben... that's all.

Gruß
Biber
Bitte warten ..
Mitglied: miniversum
24.10.2006 um 16:58 Uhr
hihi das sind 9 Zeichen keine 10 :p

miniversum
Bitte warten ..
Mitglied: Biber
24.10.2006 um 17:05 Uhr
@miniversum

Eine "3" ist mir verlorengegangen beim Copy&Paste...*gg

Es kam natürlich zurück...
01.
>echo %ln:~52,10% 
02.
3000000700
Wer achtet denn auf solche Kleinigkeiten... *gg

Thx
Biber
Bitte warten ..
Mitglied: miniversum
24.10.2006 um 18:08 Uhr
ich
hihi

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

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

Gruß
Biber
Bitte warten ..
Mitglied: miniversum
24.10.2006 um 19:45 Uhr
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
Bitte warten ..
Mitglied: Biber
24.10.2006 um 19:59 Uhr
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):
01.
>(=19:56:14  F:\=) 
02.
>for /f "delims=" %i in ('dir *.log') do @set /a "x+=1" & @echo :%i 
03.
1: Datenträger in Laufwerk F: ist FlashPen 
04.
2: Volumeseriennummer: 0815-4711 
05.
3: Verzeichnis von F:\  
06.
4:21.06.2006  13:01               246 lordifm.log 
07.
5:               1 Datei(en)            246 Bytes 
08.
6:               0 Verzeichnis(se),      4.358.144 Bytes frei 
09.
 
10.
>dir *.log|findstr /n /v "ksdahfals" 
11.
1: Datenträger in Laufwerk F: ist FlashPen 
12.
2: Volumeseriennummer: 0815-4711 
13.
3: 
14.
4: Verzeichnis von F:\  
15.
5: 
16.
6:21.06.2006  13:01               246 lordifm.log 
17.
7:               1 Datei(en)            246 Bytes 
18.
8:               0 Verzeichnis(se),      4.358.144 Bytes frei 
19.
 
In einer FOR /F-Anweisung komme ich nur auf 6 Zeilen; bei der FindStr-mimik auf 8 Zeilen.

Grüße
Biber
Bitte warten ..
Mitglied: miniversum
24.10.2006 um 21:27 Uhr
ok verstanden.
Danke

miniversum
Bitte warten ..
Mitglied: Bonanza
25.10.2006 um 07:55 Uhr
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
Bitte warten ..
Mitglied: bastla
25.10.2006 um 15:15 Uhr
Hallo Bonanza!

Ist die Länge der Nummer ebenfalls gleich bleibend? Wenn ja (Annahme: 8 Stellen), wie von Biber oben gezeigt:

01.
for /f "delims=" %%i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%%i" 
02.
@Set "Nummer=%ln:~52,8%" 
03.
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:

01.
for /f "delims=" %%i in ('findstr /n /v "akjgriarg" f:\Administrator\testklamauk.txt^|findstr "^10:"') do @Set "ln=%%i" 
02.
for /f "delims=#" %%i in ('echo %ln:~52%') do set Nummer=%%i 
03.
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]
Bitte warten ..
Mitglied: AxelHahn
26.10.2006 um 09:19 Uhr
@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 =-
Bitte warten ..
Mitglied: Biber
26.10.2006 um 11:13 Uhr
@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).

01.
::------snipp GetSubstrFromFile.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
If [%1]==[] %0 /? 
04.
If [%3]==[] %0 /? 
05.
If [%1]==[/?] (echo Syntax: %~n0 Dateiname, Zeile, StartPos, [Länge]) & goto :eof 
06.
If [%4]==[] %0 %1 %2 %3 10 
07.
set /a "ln=%2" & Set /a "offset=1" 
08.
:again 
09.
Set /a "offset+=1" & set /a "ln/=10" 
10.
If %ln% gtr 0 goto again 
11.
Set /a "offset+=%3" 
12.
for /f "delims=" %%i in ('findstr /N ". ^$" "%1"^|findstr "^%2:"') do @Set "ln=%%i" 
13.
set "substr=!ln:~%offset%,%4!" 
14.
if defined DebugMyBatches Echo [Debug]Line: [%ln%] 
15.
if defined DebugMyBatches Echo [Debug]Pos(%3,%4): [%substr%]   -- Gesetzt in der Variablen %%substr%% 
16.
endlocal & set "substr=%substr%" & if defined DebugMyBatches set substr
Demo: (Variable %DebugMyBatches% hat den Wert "1")
01.
>f:\Administrator\GetSubstrFromFile.bat Beispiel.txt 11 34 14 
02.
[Debug]Line: [11:               1 Datei(en)        539.648 Bytes] 
03.
[Debug]Pos(34,14): [539.648 Bytes]   -- Gesetzt in der Variablen %substr% 
04.
substr=539.648 Bytes
Viele Grüße zurück

Biber
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 11:53 Uhr
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
Bitte warten ..
Mitglied: bastla
26.10.2006 um 12:01 Uhr
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
Bitte warten ..
Mitglied: Biber
26.10.2006 um 12:48 Uhr
@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...
Bitte warten ..
Mitglied: bastla
26.10.2006 um 12:59 Uhr
... und

5. Die gefundene Zahl zum Umbennen einer Datei verwenden (s.o.)

Bis wir den entscheidenden Teil von 3. haben:

MitZahlUmbenennen.vbs
01.
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl 
02.
sAlt = WScript.Arguments(1) 'umzubenennende Datei 
03.
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt 
04.
 
05.
lLine = 10 'Zeilennummer für gesuchte Zahl 
06.
iPos = 50 'Position der gesuchten Zahl in der Zeile 
07.
 
08.
'für die Varianten: 
09.
iLen = 8 'fixe Länge der Zahl 
10.
'oder 
11.
sDelim = "#" 'Trennzeichen (unmittelbar nach der Zahl) 
12.
'oder 
13.
sErlaubt = "0123456789,eE+-" 'erlaubte Bestandteile der Zahl 
14.
 
15.
'Zeile lLine lesen 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
Set oDatei = fso.OpenTextFile(sDatei, 1) 
18.
For i = 1 to lLine 
19.
	sLine = oDatei.ReadLine 
20.
Next 
21.
oDatei.Close 
22.
 
23.
'Zeile kürzen 
24.
sLine = Mid(sLine, iPos) 
25.
 
26.
'Zeile auswerten 
27.
sZahl = Left(sLine, iLen) 'fixe Länge 
28.
'oder 
29.
sZahl = Left(sLine, instr(sLine, sDelim) - 1) 'Trennzeichen 
30.
'oder 
31.
sZahl = "" 'für erlaubte Zeichen 
32.
i = 1 
33.
Do While Instr(sErlaubt, Mid(sLine, i, 1)) 
34.
	sZahl = sZahl & Mid(sLine, i, 1) 
35.
	i = i + 1 
36.
Loop 
37.
 
38.
'mit gefundener Zahl Umbenennung vornehmen 
39.
Set oDateiAlt = fso.GetFile(sAlt) 
40.
oDateiAlt.Name = sZahl & sNeuTyp
Aufruf:
01.
CScript //nologo MitZahlUmbenennen.vbs DateiMitZahl.ext UmzubenennendeDatei.ext
Anmerkung: Fehlerüberprüfung und Übergabe weiterer Argumente bei Bedarf ...

Grüße
bastla
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 13:03 Uhr
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
Bitte warten ..
Mitglied: bastla
26.10.2006 um 13:09 Uhr
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
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 13:17 Uhr
Sorry falsch formuliert...

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

(Nummer steht immer an fester Stelle)

Gruß
Bonanza
Bitte warten ..
Mitglied: bastla
26.10.2006 um 13:23 Uhr
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
Bitte warten ..
Mitglied: Biber
26.10.2006 um 13:29 Uhr
....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...
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 13:29 Uhr
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
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 13:35 Uhr
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
Bitte warten ..
Mitglied: 8644
26.10.2006 um 13:40 Uhr
@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
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 14:35 Uhr
Ich weiß eure Geduld auch zu schätzen...

kann mir da jemand doch noch helfen ?



Gruß
Bonanza
Bitte warten ..
Mitglied: bastla
26.10.2006 um 14:54 Uhr
Hallo Bonanza!

Dann also als vorläufig endgültige Version

MitZahlUmbenennen.vbs
01.
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl 
02.
sAlt = WScript.Arguments(1) 'umzubenennende Datei 
03.
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt 
04.
 
05.
lLine = 10 'Zeilennummer für gesuchte Zahl 
06.
iPos = 90 'Position der gesuchten Zahl in der Zeile 
07.
iLen = 9 'fixe Länge der Zahl 
08.
 
09.
'Zeile lLine lesen 
10.
Set fso = CreateObject("Scripting.FileSystemObject") 
11.
Set oDatei = fso.OpenTextFile(sDatei, 1) 
12.
For i = 1 to lLine 
13.
	sLine = oDatei.ReadLine 
14.
Next 
15.
oDatei.Close 
16.
 
17.
'Zeile kürzen 
18.
sLine = Mid(sLine, iPos) 
19.
 
20.
'Zeile auswerten 
21.
sZahl = Left(sLine, iLen) 'fixe Länge 
22.
 
23.
'mit gefundener Zahl Umbenennung vornehmen 
24.
Set oDateiAlt = fso.GetFile(sAlt) 
25.
oDateiAlt.Name = sZahl & sNeuTyp
Aufruf:
01.
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
Bitte warten ..
Mitglied: bastla
26.10.2006 um 14:58 Uhr
@psycho

Aber nein, das wird einfach ein Rekordversuch

Grüße
bastla
Bitte warten ..
Mitglied: Biber
26.10.2006 um 15:05 Uhr
So, dann die Kurzfassungsvariante von bastla's Vorlage zum Selber-Schönmachen:

01.
' ReadFromFileLn10Pos90.vbs 
02.
sDatei = WScript.Arguments(0) 'Datei mit enthaltener Zahl 
03.
' sAlt = WScript.Arguments(1) 'umzubenennende Datei 
04.
sNeuTyp = ".txt" 'Dateityp der umbenannten Datei --> bei .txt: Name der neuen Datei = gefundeneZahl.txt 
05.
 
06.
const lLine = 10 'Zeilennummer für gesuchte Zahl 
07.
const iPos = 90 'Position der gesuchten Zahl in der Zeile 
08.
'Zeile lLine lesen 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
'----dies ist Zeile 10 .......................................................Pos. 90--->08154711         
11.
Set oDatei = fso.OpenTextFile(sDatei, 1) 
12.
For i = 1 to lLine-1 
13.
    oDatei.ReadLine 
14.
Next 
15.
sLine = oDatei.ReadLine 
16.
oDatei.Close 
17.
set oDatei = nothing 
18.
set fso = nothing 
19.
'Zeile kürzen 
20.
sLine = RTrim(Mid(sLine, iPos)) 
21.
Wscript.echo "Gefundener String: [" & sLine & "]" 
22.
'..... hier ggf die Umbenennerei ...
Demo:
01.
>cscript //nologo f:\Administrator\ReadFromFileLn10Pos90.vbs f:\Administrator\ReadFromFileLn10Pos90.vbs 
02.
Gefundener String: [08154711]
Gruß
Biber

[Edit] Uups, bastla war schon da.... [/edit]
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 15:40 Uhr
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
Bitte warten ..
Mitglied: bastla
26.10.2006 um 16:02 Uhr
Hallo Bonanza!

Einfach etwas in der Art

01.
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
Bitte warten ..
Mitglied: Bonanza
26.10.2006 um 16:52 Uhr
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
Bitte warten ..
Mitglied: Biber
26.10.2006 um 17:08 Uhr
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
Bitte warten ..
Mitglied: 8644
26.10.2006 um 17:13 Uhr
RE: #2053 ...

Auch eine Art Rekorde zu brechen!

Psycho
Bitte warten ..
Mitglied: bastla
26.10.2006 um 17:32 Uhr
@Biber

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

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

Grüße
bastla
Bitte warten ..
Mitglied: Bonanza
27.10.2006 um 07:50 Uhr
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
Bitte warten ..
Mitglied: bastla
27.10.2006 um 09:38 Uhr
Hallo Bonanza!

Für das Anlegen einer neuen Datei hätte ich folgenden Vorschlag: Ersetz die Zeile
01.
oDateiAlt.Name = sZahl & sNeuTyp
durch
01.
If Not fso.FileExists(sZahl & sNeuTyp) Then 
02.
	oDateiAlt.Name = sZahl & sNeuTyp 
03.
Else 
04.
	oDateiAlt.Name = sZahl & "_" & Date & "_" & Replace(Time, ":", ".") & sNeuTyp 
05.
End If
um an die Nummer auch Datum und Zeit anzuhängen - damit sollte es zu keinen weiteren Kollisionen kommen.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
27.10.2006 um 09:48 Uhr
...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".
Die hätte ich unbedingt in "sBestellNr" umbenannt.

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

Grüße
Biber
Bitte warten ..
Mitglied: Bonanza
27.10.2006 um 09:49 Uhr
Hehe!!
Danke euch allen...

Ich denke Ihr habt das WE wohlverdient ;)

Schönen Tag

Bonanza
Bitte warten ..
Mitglied: bastla
27.10.2006 um 10:42 Uhr
@Biber

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

Damit sich jeder gleich damit auskennt?

Grüße
bastla
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 09:08 Uhr
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
Bitte warten ..
Mitglied: bastla
30.10.2006 um 09:24 Uhr
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
Bitte warten ..
Mitglied: Biber
30.10.2006 um 09:25 Uhr
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]
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 10:15 Uhr
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
Bitte warten ..
Mitglied: bastla
30.10.2006 um 13:49 Uhr
Hallo Marcel!

Dann also statt
01.
fso.DeleteFile(sAltPfad & sZahl & sNeuTyp)
01.
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
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 13:50 Uhr
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
Bitte warten ..
Mitglied: bastla
30.10.2006 um 13:54 Uhr
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
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 14:03 Uhr
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
Bitte warten ..
Mitglied: Biber
30.10.2006 um 14:09 Uhr
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...
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 14:10 Uhr
???
Bitte warten ..
Mitglied: bastla
30.10.2006 um 14:12 Uhr
@Biber

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

Grüße
bastla
Bitte warten ..
Mitglied: 8644
30.10.2006 um 14:18 Uhr
...und was wird nun aus dem Rekord?

Psycho
Bitte warten ..
Mitglied: bastla
30.10.2006 um 14:20 Uhr
@psycho

Wir wollen doch keinen für alle Ewigkeiten aufstellen ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
30.10.2006 um 14:23 Uhr
@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
Bitte warten ..
Mitglied: Bonanza
30.10.2006, aktualisiert 18.10.2012
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

http://www.administrator.de/forum/per-vba-daten-%28wort%29-an-bestimmte ...

Gruß
Bonanza
Bitte warten ..
Mitglied: bastla
30.10.2006 um 15:15 Uhr
Hallo Bonanza!

Da es hier nur um Text zu gehen scheint, verweise ich nochmals auf meinen Hinweis im anderen Thread.

Grüße
bastla
Bitte warten ..
Mitglied: Bonanza
30.10.2006 um 15:22 Uhr
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
Bitte warten ..
Mitglied: bastla
31.10.2006 um 00:38 Uhr
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):
01.
'mit gefundener Zahl Umbenennung vornehmen 
02.
Set fso = WScript.CreateObject("Scripting.FileSystemObject") 
03.
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName) 
04.
 
05.
If fso.FileExists(sAltPfad & sZahl & sNeuTyp) Then 
06.
    oDateiAlt.Name = sZahl & "_" & _ 
07.
		Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & _ 
08.
		Replace(Time, ":", ".") & _ 
09.
        sNeuTyp 
10.
Else 
11.
    oDateiAlt.Name = sZahl & sNeuTyp 
12.
End If 
13.
 
14.
fso.DeleteFile(sDatei)
Grüße
bastla
Bitte warten ..
Mitglied: Bonanza
31.10.2006 um 10:30 Uhr
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
Bitte warten ..
Mitglied: Biber
31.10.2006 um 10:43 Uhr
...ich könnte ja mit FOR/F und FindStr /C:"................Unsere Best.:................." einen Parameter WScript.Arguments(0) für bastla's Schnipsel erzeugen..
Bitte warten ..
Mitglied: bastla
31.10.2006 um 10:48 Uhr
@Biber

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

Grüße
bastla
Bitte warten ..
Mitglied: bastla
31.10.2006 um 11:10 Uhr
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:
01.
sDatei = "O:\name.txt" 'Datei mit enthaltener Zahl 
02.
sAltPfad = "C:\Test2\" 'abschließenden Backslash beachten 
03.
sAltName = "rtdpur440101000.pdf" 'umzubenennende Datei 
04.
sNeuTyp = ".pdf" 'Dateityp der umbenannten Datei 
05.
 
06.
sSuchStr = "Unsere Best. :" 'Suchkriterium für Zeile / Position in Zeile 
07.
iLenSuchStr = Len(sSuchStr) 
08.
iLenBlanks = 20 'Anzahl der nach dem Suchkriterium auftretenden Blanks 
09.
iLenBestNr = 7 'fixe Länge der Bestellnr 
10.
 
11.
Set fso = CreateObject("Scripting.FileSystemObject") 
12.
Set oDatei = fso.OpenTextFile(sDatei, 1) 
13.
 
14.
'(derzeit) erste Zeile mit enthaltenem Suchtext finden 
15.
Do While Not oDatei.AtEndOfStream 
16.
	sLine = oDatei.ReadLine 
17.
	iPos = Instr(sLine, sSuchStr) 
18.
	If iPos > 0 Then 
19.
		'Zeile auswerten 
20.
		sBestNr = Mid(sLine, iPos + iLenSuchStr + iLenBlanks, iLenBestNr) 'fixe Länge 
21.
		Exit Do 'nur eine BestNr verarbeiten 
22.
	End If 
23.
Loop 
24.
oDatei.Close 
25.
 
26.
'mit gefundener BestNr Umbenennung vornehmen 
27.
Set oDateiAlt = fso.GetFile(sAltPfad & sAltName) 
28.
If fso.FileExists(sAltPfad & sBestNr & sNeuTyp) Then 
29.
    oDateiAlt.Name = sBestNr & "_" & _ 
30.
        Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & _ 
31.
        Replace(Time, ":", ".") & _ 
32.
        sNeuTyp 
33.
Else 
34.
    oDateiAlt.Name = sBestNr & sNeuTyp 
35.
End If 
36.
 
37.
fso.DeleteFile(sDatei)
Grüße
bastla

[Edit] Fehlendes "Loop" ergänzt [/Edit]
Bitte warten ..
Mitglied: Bonanza
31.10.2006 um 13:41 Uhr
@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
Bitte warten ..
Mitglied: bastla
31.10.2006 um 13:52 Uhr
Hallo Bonanza!

"Loop" ist jetzt da.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch - Datei aus Ordner einlesen mit Ausnahmen! (4)

Frage von Daedrafaction zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Batch & Shell
(BATCH) Präfix aus einem USERNAME auslesen (1)

Frage von TomMaverick zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...