intermde
Goto Top

TXT Datei an bestimmten Stellen umbrechen und einen von bis bereich makieren und in ein neues TXT File mit bestimmter Bezeichnung speichern

Hallo, habe ein Problem wo ich nicht weiter komme. Muss dazu sagen, dass ich keine Ahnung von Programierung habe, aber vielleicht kann mir hier jemand weiterhelfen.

Habe eine TXT Datei mit folgendem Aufbau

IM2146564|Test1 gregt gergerg gerge|Test2|Test3 vfewgw gwgw weggweg
Test4
IM5464645|TestA jk jkljhjkl jkljkhhklh gfhg ghdfhfg |TestB vsdgsd gagaga fgsasgasgsag gassggsa IM654321 beher egwqgwe
TestC

TestD
IM5464664|TEST1|TEST2|TEST3

Die Datei soll nun wie folgt per Script aufgelöst werden

IM2146564|
Test1 gregt gergerg gerge|
Test2|
Test3 vfewgw gwgw weggweg
Test4

IM5464645|
TestA jk jkljhjkl jkljkhhklh gfhg ghdfhfg |
TestB vsdgsd gagaga fgsasgasgsag gassggsa IM654321 beher egwqgwe
TestC

TestD

IM5464664|
TEST1|
TEST2|
TEST3

Nun folgt aber der weitere Punk, dass ich hier gut 90000 Zeilen habe ( 2680 Datensätze)
wo aus jedem von IMXXXXXX bis zum Anfang des nächsten IMXXXXXX (IMXXXXXX kann aber auch mittem im Text vorkommen, darf aber nicht verwendet werden) der jeweilige Inhalt in eine neue TXT Datei kopiert werden soll und unter dem Dateinamen (wie aus Beispiel)
IM2146564 Test2.txt
IM5464645 TestB.txt
IM5464664 TEST2.txt
zeugt werden, und am Schluß 2680 TXT Dateien habe.

Oder wenn technisch so nicht machbar, dann ggf umgekehrt
1.
von IMXXXXXX bis zum Anfang des nächsten IMXXXXXX (IMXXXXXX kann aber auch mittem im Text vorkommen) der jeweilige Inhalt in eine neue TXT Datei kopiert werden soll und unter dem Dateinamen (wie aus Beispiel)
IM2146564 Test2.txt
IM5464645 TestB.txt
IM5464664 TEST2.txt

2. in den jeweiligen neuen TXT Files den Umbruch erzeugen

Sollte das Problem nicht ausführlich genug beschrieben wurde kann hier eine org. Datei mit 6 Datensätzen zur Verfügung stellen..

Ich hoffe es kann mir hier jemand weiter helfen.

Content-ID: 146778

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

Ausgedruckt am: 25.11.2024 um 11:11 Uhr

SamvanRatt
SamvanRatt 13.07.2010 um 10:07:17 Uhr
Goto Top
Hi
hast du dir schon mal sed (=Seriell Editor) angesehen; sofern Regexp mit vorkommen oder so ist er hervorragend für sowas geeignet
Gruß
Sam
manuel-r
manuel-r 13.07.2010 um 10:10:22 Uhr
Goto Top
Mal kurz angerissen wie es funktioniert:
  • Datei per Script zeilenweise einlesen
  • In jeder eingelesenen Zeile prüfen ob die ersten beiden Zeichen IM lauten
  • Wenn ja, dann Zeile anhand Trennzeichen | in ein Array splitten
  • Aus den einzelnen Werten des Arrays den Dateinamen und die Dateiinhalte generieren
  • Neue Datei schreiben
  • nächste Zeile einlesen bis EOF
  • Fertig

Manuel
intermde
intermde 13.07.2010 um 10:18:37 Uhr
Goto Top
Sorry, ich verstehe trotz der ausführlichen Umschreibung nur Bahnhof ( Dennoch vielen Dank für die schnelle Antwort).
Kenne mich mit Scripten und Programierung nicht aus,
Hab hier nur die Aufgabe bekommen das File umzuschüsseln um dieses in ein anderem Programm einlesen zu können.
manuel-r
manuel-r 14.07.2010 um 13:37:22 Uhr
Goto Top
Das sind dann wohl denkbar schlechte Voraussetzungen für ein solches Projekt.
Du hast dann wohl nur zwei Möglichkeiten: Entweder findest du irgendein Tool mit dessen Hilfe du das bewerkstelligen kannst oder du eignest dir einige Scripting-Kenntnisse an.
pieh-ejdsch
pieh-ejdsch 14.07.2010 um 14:44:10 Uhr
Goto Top
Hi Intermde,

wie Du zwar bei der 2. Datei auf IM5464645 TestB.txt kommst kann ich nicht nachmachen

zur Zeit ist das Auswahlkriterium des Hinteren Namenteiles, dass es in der selben Zeile, welche mit IM beginnen, ist und dahinter noch ein | zu finden ist.

das ganze könnte in etwa so gehen:
Bitte erst mit Testdaten ausprobieren!
@echo off& setlocal
set "InPut=testfile.txt"  
set "Pfad=D:\AdminHelp"  
PushD "%Pfad%"  
type nul>"%temp%\tmp"  
for /f "usebackq tokens=*" %%i in ("%InPut%") do (set "Line=%%i"  
	call :Line
)
move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
pause
goto :eof
:Line
if "IM%Line:*IM=%" == "%Line%" set "x=1"  
:Split
if "%Line:*|=%" == "%Line%" (set "y=1"&goto :Write)  
set "y="  
set "Linepost=%Line:*|=%"  
call set "Line=%%Line:%Linepost%=%%"  
set "Line=%Line:|=%"  
for /f %%i in ("%Line%") do set "Test=%%i"  
if /i "Test%Test:*Test=%" == "%Test%" set "Post=%Test%"  
:write
for /f "tokens=*" %%i in ("%Line%") do (  
	if defined x (set "File=%%i"  
		set "x="  
		move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
		)
	echo %%i>>"%temp%\tmp"  
)
set "Line=%LinePost%"  
if not defined y goto :Split

Gruß Phil
intermde
intermde 15.07.2010 um 10:14:49 Uhr
Goto Top
Hallo Phil,

ersteinmal ein ganz grosses Lob an dich.

RESPEKT

Habe dieses über eine Testdatei laufen lassen

( 19 Datensätze)
er erzeugt auch von diesen 19 Datensätzen 8 Stück und bricht mit der Meldung

"passender" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Habe mir die Datensätze angeschaut hierl iegt wohl das Problem das Inhaltlich Wörter in " " gesetzt worden sind.
Kann man dieses im Script mit beachten und übergehen lassen, so dass dies die " " mit übernommen werden.
Mir ist aufgefallen das im Text File der "Datenbank " auch Zeichen wie #; !; ' enthalten sind.
Können die auch Probleme verursachen

Vielen Dank für die weitere Hile
pieh-ejdsch
pieh-ejdsch 15.07.2010 um 11:10:33 Uhr
Goto Top
Moin Intermde,

das liegt dann daran, dass in Zeile 13; 15 und 21 nur Variablen mit Umgebenden % Prozentzeichen im IF sofort beim auslesen der Zeile Aufgelöst werden.
wenn in diesen Variablen dann " Anführungszeichen enthalten sind - beeinflussen diese auch den IF - Vergleich -> und die Zeile wird zum Syntaktischen Fehler für die CMD.

das Ganze Umgehst Du, wenn die Variable entweder
  1. mit Setlocal EnableDelayedExpansion und dem Umgebenden ! Ausrufezeichen im IF Vergleich Aufgelöst werden - oder
  2. Die Anzuzeigenden Variablen in jeweils eine ForSchleife packst und die Dynamischen (oder auch LaufVariablen genannt) in den IF - Vergleich packst.

(Zeile 05 angepasst)

@echo off& setlocal
set "InPut=testfile.txt"  
set "Pfad=D:\AdminHelp"  
PushD "%Pfad%"  
del /q "%temp%\tmp" 2>nul  
for /f "usebackq tokens=*" %%i in ("%InPut%") do (set "Line=%%i"  
	call :Line
)
move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
pause
goto :eof
:Line
for /f "tokens=*" %%i in ("IM%Line:*IM=%") do for /f "tokens=*" %%j in ("%Line%") do if "%%i" == "%%j" set "x=1"  
:Split
for /f "tokens=*" %%i in ("%Line:*|=%") do for /f "tokens=*" %%j in ("%Line%") do if "%%i" == "%%j" (set "y=1"&goto :Write)  
set "y="  
set "Linepost=%Line:*|=%"  
call set "Line=%%Line:%Linepost%=%%"  
set "Line=%Line:|=%"  
for /f %%i in ("%Line:"=%") do set "Test=%%i"  
for /f "tokens=*" %%i in ("Test%Test:*Test=%") do for /f "tokens=*" %%j in ("%Test%") do if /i "%%i" == "%%j" set "Post=%Test%"  
:write
for /f "tokens=*" %%i in ("%Line%") do (  
	if defined x (set "File=%Line:"=%"  
		set "x="  
		move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
		)
	echo %%i>>"%temp%\tmp"  
)
set "Line=%LinePost%"  
if not defined y goto :Split

Passt es denn mit der NachnamensErstellung?

Gruß Phil
intermde
intermde 15.07.2010 um 11:55:42 Uhr
Goto Top
Passt noch nicht 100%, erhalte beim Ausführen noch einige FM:

C:\test>1.bat
Die Datei "t °?er?▬?↨et"" kann nicht gefunden werden.
Die Datei "a³? i?↑?▬" kann nicht gefunden werden.
Die Datei "z¸U Z?↑?↑in Urlaub ist." kann nicht gefunden werden.
Die Datei "z??s♀?" kann nicht gefunden werden.
Die Datei " is½?" kann nicht gefunden werden.
Die Datei "rlÁ?b ?↑?↑" kann nicht gefunden werden.
Die Datei "r ZeÅ? i?↑?↑laub ist." kann nicht gefunden werden.
Die Datei "SeitÝ?m ?↓?↑t dieses Problem auf... Laut AW ist kein Admin im Hause,
da er zur Zeit in Urlaub ist." kann nicht gefunden werden.
Die Datei "temp♀Rn u§?↨"noch" kann nicht gefunden werden.
Die Datei " ♣hd O§?↓h" kann nicht gefunden werden.
Die Datei "s♣h" kann nicht gefunden werden.
Die Datei "04 ??SH?↔?↔ELT): Incident ³bernommen 26.01.10 15:45:19 (EMail close
26.01.2010 15:38:20 Georg Hofer): " kann nicht gefunden werden.
Die Datei "n f??ie?▬?→rkt|07.07.2010 15:42:10 (ISH.SCHMOELE): Mail entsprechend
an Zentralaufgaben / CC Standort versendet|+++++++ L÷sung ++++++++ 07.07.2010 1
5:42:09 (ISH.SCHMOELE): Mail entsprechend an Zentralaufgaben / CC Standort vers
endet" kann nicht gefunden werden.
Die Datei ")8?À§?§?▲CROSS 1 Zeiten wurde auch in der Spalte Monat sowie Jahr der
Echtwert "" kann nicht gefunden werden.
Die Datei "wur0?n ?§?↔ jene Kennzahlen, die einen Tageszustand "" kann nicht ge
funden werden.
Die Datei "she(?ge?§?↔chtssagenden "" kann nicht gefunden werden.
Die Datei " L♀N?" kann nicht gefunden werden.
Die eingegebene Zeile ist zu lang.
":Line
" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Es werden zwar Textfiles erzeugt , aber nicht alle.
Hab ich die Möglichkeit dir ggf das org File zukommen zu lassen, dass du hier mal einsehen kann wie der Aufbau der Datei wirklich ist.

Grüße aus Köln...
pieh-ejdsch
pieh-ejdsch 15.07.2010 um 14:40:22 Uhr
Goto Top
na sowas FM's

sind sicher Klammern oder AnführungsZeichen schuld.
dann breiten wir dies mal ein bisschen auseinander.

@echo off& setlocal
set "InPut=testfile.txt"  
set "Pfad=D:\Adminhelp"  
PushD "%Pfad%"  
del /q "%temp%\tmp" 2>nul  
for /f "usebackq tokens=*" %%i in ("%InPut%") do (  
	set "Line=%%i"  
	call :Line
)
move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
pause
goto :eof
:Line
for /f "tokens=*" %%i in (  
	"IM%Line:*IM=%"  
) do for /f "tokens=*" %%j in (  
	"%Line%"  
) do if "%%i" == "%%j" set "x=1"  
:Split
for /f "tokens=*" %%i in (  
	"%Line:*|=%"  
) do for /f "tokens=*" %%j in (  
	"%Line%"  
) do if "%%i" == "%%j" (set "y=1"&goto :Write)  
set "y="  
set "Linepost=%Line:*|=%"  
call set "Line=%%Line:%Linepost%=%%"  
set "Line=%Line:|=%"  
for /f %%i in (
	"%Line:"=%"  
) do set "Test=%%i"  
for /f "tokens=*" %%i in (  
	"Test%Test:*Test=%"  
) do for /f "tokens=*" %%j in (  
	"%Test%"  
) do if /i "%%i" == "%%j" set "Post=%Test%"  
:write
for /f "tokens=*" %%i in (  
	"%Line%"  
) do (
	if defined x (
		set "File=%Line:"=%"  
		set "x="  
		move "%temp%\tmp" "%Pfad%\%File% %Post%.txt" 2>nul  
		)
	echo %%i>>"%temp%\tmp"  
)
set "Line=%LinePost%"  
if not defined y goto :Split

wenn jetzt noch eine Datei nicht erzeugt wird und der Inhalt in einer anderen stehen sollte, dann sind die Zeichen / \ : * ? | > <, welche nicht in den Namen einer Datei oder eines Ordners gehören, im neuen Dateinamen vorhanden.

Gruß Phil
TsukiSan
TsukiSan 16.07.2010 um 08:40:56 Uhr
Goto Top
Kurze Frage:

wäre dieser 4-Zeiler
MeineDatei = "C:\NeuUmbruch.txt"  

Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Replace(FSO.OpenTextFile(MeineDatei, 1).ReadAll,"|", vbCrLF)   

msgbox MyText
auch ein Lösungsansatz (in VBS)?

gruss
Tsuki
intermde
intermde 16.07.2010 um 12:20:13 Uhr
Goto Top
Danke Phil für die bisherige gute Hilfe.

Ich habe mir nochmal Gedanken gemacht, da hier wohl zu viele unterschiedliche Zeichen im Text stehen die mit einem Script nicht abgegriffen werden
und dabei weitere Probleme bestehen.

Habe daher die Datei nochmal ein wenig Modifiziert, Trennzeichen wie | sind nicht mehr vorhanden, es müssen keine Umbrüche ect mehr erzeugt werden , da in der neuen TXT bereits alles aufgegliedert wurde.:

Die Datei sieht wie folgt aus und ist immer geich aufgebaut:

IM12345678 <= (immer IM+8 Zeichen gefolgt von einem Umbruch)

TEXTE mit unterschiedlichen Absätzen und Zeichen

STOP* <= (ENDE des Blocks)
IM87654321 <= (immer IM+8 Zeichen gefolgt von einem Umbruch)

TEXTE mit unterschiedlichen Absätzen und Zeichen

STOP* <= (ENDE des Blocks)
IMxxxx.......

Gibt es die Möglichkeit alles was mit IMXXXXXXXX <= (immer IM+8 Zeichen gefolgt von einem Umbruch)
anfängt und mit STOP* endet in ein neues File zu überführen ( und dabei als Dateinamen das was der ersten Zeile steht ( in diesem Fall IMxxxxx) zu übernehmen?
intermde
intermde 16.07.2010 um 12:20:37 Uhr
Goto Top
PS VBS hab ich selber noch nicht auf dem Rechner installiert
TsukiSan
TsukiSan 16.07.2010 um 16:35:22 Uhr
Goto Top
PS VBS hab ich selber noch nicht auf dem Rechner installiert
muss nicht installiert werden. Ist ein "Boardmittel" von MS.
Du trägst das Schnipsel einfach in ein "txt"-file ein und benennst es "hinten" in "vbs" um.
Dann nur noch doppelklicken.

Aber ich denke, ihr seid in Batch schon so weit, dass eine Überlegung in VBS (VisualBasicScript)
nur (eventuell) unnötig wäre. Aber meine Idee war nur die, dass eventuell jemand anderes, der diesen Thread liest, eventuell mit VBS etwas ähnliches lösen möchte.

Gruss
Tsuki
intermde
intermde 16.07.2010 um 17:20:46 Uhr
Goto Top
Aber vielleicht ist für dich u.a. im VBS Script eine möglichkeit gegeben die anforderrung mit ein paar zeilen Quellcode umzusetzen.

Folgendes soll eigentlich passieren:

Makiere alles, bis das Wort STOP* gefunden wird,
kopiere dieses in ein neues Dokument und speicher es als txt ab,
und führe die Schleife fort mit dem nächsten Datensatz

Die Datei sieht wie folgt aus und ist immer gleich aufgebaut:

IM12345678 <= (immer IM+8 Zeichen gefolgt von einem Umbruch)

TEXTE mit unterschiellichen Absätzen und Zeichen

STOP* <= (ENDE)
IM87654321 <= (immer IM+8 Zeichen gefolgt von einem Umbruch)

TEXTE mit unterschiellichen Absätzen und Zeichen

STOP* <= (ENDE)
IMxxxx.......
TsukiSan
TsukiSan 16.07.2010 um 17:38:27 Uhr
Goto Top
eventuell hätte ich einen Vorschlag in VBS:
Deine Datei ist ungefähr so aufgebaut: (habe unter "C:\" Eine Datei mit dem Namen "Stop.txt" angelegt und folgende Einträge eingefügt)
IM12345678
1
2
3
STOP
IM87654321
Ä
Ö
Ü
STOP
IM12345678
a
s
d
f
g
h
Stop
usw.

Dann kopiere dir mal zum Testen folgenden Code in VBS:
MeineDatei = "C:\Stop.txt"  

Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll,vbCrLF & "IM")   

msgbox Mytext(0)

for i = 1 to Ubound(MyText)
	msgbox "IM" & Mytext(i)  
Next

Ist es so in etwa, was du meinst?

Gruss
Tsuki
intermde
intermde 16.07.2010 um 17:42:07 Uhr
Goto Top
Das ist doch auch mal TOP.

Wenn die Ausgabe nun anstatt auf dem Bildschirm in eine TXT Datei mit der IM Nummer gespeichert werden könnte wäre das ideal,
Wichtig wäre das ALLES VON IMxxxxx bis STOP* wirklich auch abzufragen und den Inhalt in eine Textdatei zu bekommen.
TsukiSan
TsukiSan 16.07.2010 um 18:05:20 Uhr
Goto Top
na eventuell so:
MeineDatei = "C:\Stop.txt"  

Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll,vbCrLF & "IM")   

	Set MyFile = FSO.CreateTextFile("c:\" & Left(Mytext(0),10) & ".txt" , true)  
	MyFile.WriteLine (Mytext(0))
	MyFile.Close

for i = 1 to Ubound(MyText)
	on error resume next
	Set MyFile = FSO.CreateTextFile("c:\IM" & Left(Mytext(i),8) & ".txt" , true)  
	MyFile.WriteLine (Mytext(i))
	MyFile.Close
Next

Wäre dir das recht?

Gruss
Tsuki
intermde
intermde 16.07.2010 um 18:12:21 Uhr
Goto Top
HEY...DAS IST TOPPPPP!!! face-smile

Ich werde das gleich mal mit einem anderen File austesten
und wenn das funktioniert.

wo kann ich die 5 STERNE hinterlassen?
TsukiSan
TsukiSan 16.07.2010 um 18:15:36 Uhr
Goto Top
Wenn ich das Script ausprobiere passiert nach dem doppelklick nichts.
Schau mal unter "C:\" nach!
Da müßten einige Dateien neu angelegt sein!

[Edit]
diese Antwort hat sich auch erledigt. Alles schmilzt dieser Tage face-wink
[/Edit]
TsukiSan
TsukiSan 16.07.2010 um 18:17:53 Uhr
Goto Top
wo kann ich die 5 STERNE hinterlassen?
Ich bin bescheiden! Ein kühles Hopfen bei den heutigen Temperaturen reicht völlig aus face-wink

Gruss
Tsuki

[Edit]
Aber ein bastla sollte hier lieber nochmals drüber schauen!!!!!!
[/Edit]
intermde
intermde 16.07.2010 um 18:21:53 Uhr
Goto Top
für mich ist es nur ganz wichtig, dass er alles bis STOP* mit nimmt.
Aber das werd ich mit hmm nun ja 20-30 Datensätzen testen.
TsukiSan
TsukiSan 16.07.2010 um 18:23:12 Uhr
Goto Top
halt uns auf dem laufenden! Die Batch-Dinger sind auch bestens!

Ein schönes WE

Tsuki
bastla
bastla 16.07.2010 um 19:09:47 Uhr
Goto Top
Hallo Tsuki!

Auf ganz speziellen Wunsch face-smile:
"Split()" wäre auch meine Wahl, allerdings würde ich die eigens eingefügte Markierung "STOP*" zum Aufteilen verwenden:
MeineDatei = "C:\Stop.txt"  
Marke = "STOP*" 'Blockende-Markierung  
Ziel = "C:\" 'Zielordner für die zu erstellenden Einzeldateien  

If Right(Ziel, 1) <> "\" Then Ziel = Ziel & "\" 'Sicher stellen, dass Zielpfad mit "\" endet  
Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll, Marke) 

For i = 0 To Ubound(MyText)
    If Left(MyText(i) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen  
    If Len(MyText(i)) > 10 Then FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & ".txt").Write MyText(i) 'Block nur verarbeiten, wenn mehr als 10 Zeichen lang  
Next
Das zweite "If" soll sicherstellen, dass keine zu kurzen Blöcke (vor allem nach der letzen Marke) berücksichtigt werden - scheint mir vorteilhafter als "On Error Resume Next" ...

Falls übrigens am Ende der einzelnen Dateien eine Zeilenschaltung gewünscht wäre, "WriteLine" anstelle von "Write" verwenden.

Grüße
bastla

... und übrigens face-wink : ein leicht verspätetes "Willkommen im Forum, intermde"!
intermde
intermde 19.07.2010 um 07:00:01 Uhr
Goto Top
Wünsche einen guten Morgen ,
danke Bastla,


danke für das weitere Script.

Dieses erzeugt beim Ausführen folgenden Fehler;
Windows Script Host
Skript: C:\test\schrip2.vbs
Zeile: 10
Zeichen: 32
Fehler: ')' erwartet
Code: 800A03EE
Quelle: Kompilierungsfehler in Microsoft VBScript

OK


Ich habe da noch eine Frage, besteht die Möglichkeit den Absatz mit IMxxxxx + die 3 Zeile als Dateiname zu verwenden?
So das IM12345678 TEST.txt heraus kommt?

Aufbau des Files:

IM12345678

TEST

rgghrwe
ghherh
herh

STOP*
TsukiSan
TsukiSan 19.07.2010 um 07:31:51 Uhr
Goto Top
Hallo intermde

in Zeile 10 fehlt eine Klammer. Erstze sie wie folgt:
If Left(MyText(i)) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen  

für deine 2te Anforderung ginge eventuell nach Zeile 9 (bastlas Script!)
temp = Split(MyText(i), vbCrlf)

und dann die Zeile 11 eventuell so barbeiten:
If Len(MyText(i)) > 10 Then FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & temp(2) & ".txt").Write MyText(i) 'Block nur verarbeiten, wenn mehr als 10 Zeichen lang   

Bitte mal testen und bastla wird uns eh sagen, was ich falsch gemacht habe face-wink

Gruss
Tsuki
bastla
bastla 19.07.2010 um 08:33:14 Uhr
Goto Top
@tsuki
Eigentlich habe bisher nur ich etwas falsch gemacht - danke für die Korrektur. face-smile

Deine Ergänzung sollte so funktionieren - Du könntest vielleicht mit einer Überprüfung von "UBound(temp)" noch sicherstellen, dass es auch tatsächlich eine Zeile 3 gibt ...

Grüße
bastla
TsukiSan
TsukiSan 19.07.2010 um 08:35:54 Uhr
Goto Top
Hi bastla

Eigentlich habe bisher nur ich etwas falsch gemacht - danke für die Korrektur.
Na, na, na! Ich habe jede Menge von dir hier gelernt. Und als Fehler würde ich die fehlende Klammer nicht ansehen.
Ehr als Tastaturproblem. face-wink

Deine Ergänzung sollte so funktionieren - Du könntest vielleicht mit einer Überprüfung von "UBound(temp)" noch
sicherstellen, dass es auch tatsächlich eine Zeile 3 gibt ...
Das ist ein sehr guter Hinweis.

Viele Grüße
Tsuki
bastla
bastla 19.07.2010 um 08:40:24 Uhr
Goto Top
Hallo Tsuki!
... als Tastaturproblem. face-wink
Den muss ich mir merken ... face-wink

Tatsächlich war's der typische Fall von "Verschlimmbesserung beim Posten" - getestet hatte ich noch ohne das "If Left(..." ...

Grüße
bastla
intermde
intermde 19.07.2010 um 09:06:06 Uhr
Goto Top
und nun kommt wieder ne frage des DummUsers:

Zeile 9 ; 10 und 11 angepasst, aber wo schreib ich
UBound(temp) hin?

Vielleicht kann mir jemand den quelltext nochmal zusammengefasst schreiben?

Ich glaub das We war wohl zu heftig *lol

Grüße aus Köln und ein danke schön für die tolle Hilfe....
TsukiSan
TsukiSan 19.07.2010 um 10:10:57 Uhr
Goto Top
na ich würd's dann eventuell so mal probieren:
MeineDatei = "C:\Stop.txt"  
Marke = "STOP*" 'Blockende-Markierung  
Ziel = "C:\" 'Zielordner für die zu erstellenden Einzeldateien  

If Right(Ziel, 1) <> "\" Then Ziel = Ziel & "\" 'Sicher stellen, dass Zielpfad mit "\" endet  
Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll, Marke) 

For i = 0 To Ubound(MyText)
    temp = Split(MyText(i), vbCrlf)
    If Left(MyText(i)) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen  
    If Len(MyText(i)) > 10 Then
              If  UBound(temp) > 2 then
                         FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & temp(2) & ".txt").Write MyText(i)  
              Else
                         FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & ".txt").Write MyText(i)  
            End If
     End If
Next

nochmals drüber schauen, bitte!

Gruss
Tsuki
intermde
intermde 19.07.2010 um 10:42:46 Uhr
Goto Top
Danke schön. Bringt beim ausführen leider folgende FM:
Windows Script Host
Skript: C:\test\schrip2.vbs
Zeile: 11
Zeichen: 5
Fehler: Falsche Anzahl an Argumenten oder ungültige Eigenschaftszuweisung: 'Left'
Code: 800A01C2
Quelle: Laufzeitfehler in Microsoft VBScript

OK

Könntest nochmal drüber schaun?
bastla
bastla 19.07.2010 um 11:53:41 Uhr
Goto Top
Hallo intermde!

Wenn ich etwas verpfusche, dann aber gleich ordentlich face-sad - nimm diese Zeile 11:
If Left(MyText(i), 2) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen
Grüße
bastla
intermde
intermde 19.07.2010 um 12:50:01 Uhr
Goto Top
Danke für die Hilfe,

klappt bei der 1 TXT Datei ohne Probleme, alle anderen Files generiert er nur die TXT Files mit der IM Nummer.

Grüße
Sven
bastla
bastla 19.07.2010 um 15:09:48 Uhr
Goto Top
Hallo intermde!

Das wäre vor allem dann der Fall, wenn in den anderen Blöcken keine Zeile 3 existiert oder diese leer ist ...

Könntest Du ein (bei Bedarf anonymisiertes) Beispiel des aktuellen Standes der Ausgangsdatei bzw der ersten zB 5 Blöcke davon (unter Verwendung von "<code>"- und "</code>"-Tags) posten?

Grüße
bastla
intermde
intermde 19.07.2010 um 16:48:58 Uhr
Goto Top
Hier mal ein Beispiel mit 3 Datensätzen

IM08875912

XXXXXXXX - GGGGGG GGGGG - evhkgöl lkögklö rklrelkö rklözerklj zerkl

rklkljglkjretk ljkljtjkl kltjre kljtkljözt ölkjzer ölkjzkjlöz twlkjzt lkjzkjlz kjljkltz jklztlk

17.04.2009 15:59:07 
(ISH.AAAAAAA): relköherhj lkhth4hjtrjket kjretjkretjkrt ljkjrkt rjjkr rhajkt

++++++Lösung +++++++

17.04.2009 15:59:07 
(ISH.AAAAAAA): Drelkgrelkgklerjtlkjö zklkjlzerlkjreklzerlkjrelkzerzreutztruztrztruwurtutuutrutzjtewrturetzutzioutztutuoiztezutuirtueutterztretbtrhuzr ugrhjugteh erhet herhotp er hear oihaereoih eqhioziho hiozhio rzpoihqeriohzp iohpzioheoihprezihopre

STOP*
IM11050056

XXXXXXXX - EEEEEEEE  Bei Anlage FM: - vewlkjhglhrekhlgkljerlkjökljrekjlerklhelkjhrsjökjf,gklhegkölaer lköhklkljhkljkljklt

15.03.2010 11:07:07 
(ISH.BBBBBBBB): fdkgfhklö jklöhkltkljte zlkjötrzkjt zlktrztr ztölkrzkzlktzkzklzklöwr

++++++Lösung +++++++

15.03.2010 11:06:59 
(ISH.BBBBBBBB): grjehjreherjhjeh lkghlerghrelkhgkhlerlkhr

STOP*
IM11462149

XXXXXXX - DDDDD - AAAAAAAAA - ewkjölreagklöjj lkökjlgkl hlkjer kljerklj kljöekl

kejlkjeherhjerhj lkhkltrklhrjklewkjlwreö kjlkljwkl jzrktljzlk

04.05.2010 09:51:43 
(ISH.DDDDDDDD): Uklglkjwekljrekjelkjzreköj bkzk herlkjö lkrejtkljörtklöjertklröj.

++++++Lösung +++++++

04.05.2010 09:51:36 
(ISH.DDDDDDDD): Ureklgelkjgekljglkjgerlkjbkbvkl tlktkljretklertkleklzt tkljtkreljkljtkwtezw
zrzrwzzrtzrtzu
zherzu4ruzrt4uerut

truutrlzkrturlktiuort tioeroitioertioereztoiw

STOP*
IM10770448

XXXXXX - DDD DDDD DDDD

-------------------------------------------------------------------------------------------------------------

09.02.2010 11:39:51 
(ISH.CCCCCCCC): ewgkljwglkj gjklglkj klejr tkljert lkrejtkljsrtrkljtrlkj trlkj zkrljeelkjrzelkjz

++++++Lösung +++++++

09.02.2010 11:39:51 
(ISH.CCCCCCCC): vedjklglkjwelktewkljr lkjbrelkjt lkjöktljr er tre
ghretretretret
ret
ert
rretteteerz  09.02.2010 10:59:11 
(ISH.CCCCCCCC): csfghklgkltkl kljtwekjltewkltkl jtwekljt wkljtwejkltewkljtewlkjtr

STOP*
IM11200045

XXXXX - BAL BLA BLA - BLUB BLUB BLUB - 2gewrkgtklj kljkjlre kljttkljerkljt relkt.

elkjfgejklt gklj4kjl3lkjkl jkljt34lkjlkjk4lj klvjt43klj

01.04.2010 16:44:23 
(ISH.EEEEEEEE): ewjkfjg  lkjewklt weklewrkl tewrkljter klrelkjt kl jtwelkj wktljew

++++++Lösung +++++++

01.04.2010 16:44:23 
(ISH.EEEEEEEE): csajavsjjjkfjk jkj kew jwejkwe jwekjtwejk tejk therkjte.  01.04.2010 16:17:46 
(ISH.EEEEEEEE): Agjkgjglkewkjlklj lktklwkltkl tklj relkjtkrljt kjlertkljrtrekjltrkle  01.04.2010 16:16:29 
(ISH.EEEEEEEE): Adkllkjldgklegkljk ktklewrkltkl wlkö kölwekltlkt kwlt k wölj 01.04.2010 15:57:14 
(ISH.EEEEEEEE): kgjeajkgeköjlgeökgerköjgkgkgklög  01.04.2010 15:11:51 
(ISH.AAAAAAA): Fekwklglk kltklgklrtklj treklrtkltrkelklerj

STOP*
IM11000046

rejkeghre geklrglkreklgkl gelkjgrkelkelrg klgerlgkjreklr

felkkjlfekljghkljeakhl gklreklgeklgeklö kljvjkeklkerklörg

09.03.2010 07:38:32 
(ISH.CCCCCCCC): fglkelkklgklgkl krekgektekeklök greklgterköltkjlöet tewkrltklertkltkölköt

++++++Lösung +++++++

09.03.2010 07:38:29 
(ISH.CCCCCCCC): dggreg jjhhegjrek  grejgjkerjkerjgkgjrejer gtejkgrejkgjkgjkherjkger

STOP*
bastla
bastla 19.07.2010 um 17:18:24 Uhr
Goto Top
Hallo intermde!

Durch Vertauschen der Zeilen 10 und 11 sieht das Script jetzt so aus:
MeineDatei = "C:\Stop.txt"  
Marke = "STOP*" 'Blockende-Markierung  
Ziel = "C:\" 'Zielordner für die zu erstellenden Einzeldateien  

If Right(Ziel, 1) <> "\" Then Ziel = Ziel & "\" 'Sicher stellen, dass Zielpfad mit "\" endet  
Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll, Marke) 

For i = 0 To Ubound(MyText)
    If Left(MyText(i), 2) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen  
    temp = Split(MyText(i), vbCrlf)
    If Len(MyText(i)) > 10 Then
        If  UBound(temp) > 2 Then
            FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & temp(2) & ".txt").Write MyText(i)  
        Else
            FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & ".txt").Write MyText(i)  
        End If
    End If
Next
und sollte auch funktionieren - allerdings nicht mit Deinen Beispieldaten, da in der Zeile 3 des zweiten Blocks ein ":" und damit ein für Dateinamen nicht erlaubtes Zeichen (weitere wären: "*?\/<|>) enthalten ist ...

Wie realistisch ist diese Möglichkeit bei "Echtdaten", und was soll ggf in diesem Fall passieren?

Grüße
bastla
intermde
intermde 19.07.2010 um 17:27:34 Uhr
Goto Top
Die Frage ist, ob die Möglichkeit besteht per Script aus der dritten Zeile alle Sonderzeichen heraus zu nehmen. z.b. durch ein " " ersetzen. Da diese für den Titel in der Bezeichnung keine Rolle spielen.
bastla
bastla 19.07.2010 um 17:34:46 Uhr
Goto Top
Hallo intermde!
... aus der dritten Zeile alle Sonderzeichen heraus zu nehmen. z.b. durch ein " " ersetzen ...
... wäre auch mein Vorschlag, allerdings Ersetzung nur für den Dateinamen, nicht im Dateiinhalt:
MeineDatei = "C:\Stop.txt"  
Marke = "STOP*" 'Blockende-Markierung  
Ziel = "C:\" 'Zielordner für die zu erstellenden Einzeldateien  
DieNicht = ":*?\/<|>""" 'in Dateinamen nicht zulässige Zeichen  

If Right(Ziel, 1) <> "\" Then Ziel = Ziel & "\" 'Sicher stellen, dass Zielpfad mit "\" endet  
Set FSO = CreateObject("Scripting.FileSystemObject")  
MyText = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll, Marke) 

For i = 0 To Ubound(MyText)
    If Left(MyText(i), 2) = vbCrLf Then MyText(i) = Mid(MyText(i), 3) 'keine Zeilenschaltung am Anfang des Blocks zulassen  
    If Len(MyText(i)) > 10 Then
        temp = Split(MyText(i), vbCrlf) 'Block in Zeilen-Array "temp" zerlegen  
        If  UBound(temp) >= 2 Then 'mindestens 3 Zeilen vorhanden?  
            N = temp(2) 'Dateinamen um Inhalt der Zeile 3 erweitern, ...  
            For a = 1 To Len(DieNicht)
                N = Replace(N, Mid(DieNicht, a, 1), " ") '... vorweg aber unzulässige Zeichen durch Blank ersetzen  
            Next
            FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & N & ".txt").Write MyText(i) 'Block mit erweitertem Dateinamen schreiben  
        Else
            FSO.CreateTextFile(Ziel & Left(Mytext(i),10) & ".txt").Write MyText(i) 'Block nur mit "IM########" als Dateinamen schreiben  
        End If
     End If
Next
Grüße
bastla
intermde
intermde 19.07.2010 um 18:51:00 Uhr
Goto Top
Hallo, danke an alle.

Klappt bestens. SUPER.

Danke für die Unterstützung.....