mario.steinberg
Goto Top

Durch Leerzeichen getrennte Wörter Filtern

Hallo,

ich hoffe mir kann jemand weiterhelfen. Ich habe mit den Infos aus dem Forum schon mal etwas rumprobiert aber noch zu keiner guten Lösung gekommen.

Ich habe eine Datei mit folgendem Aufbau

               848      820 harry        Src\Forms\obj\Release\res_1.resources
               848      820 harry        Src\Forms\obj\Release\res_2.resources
M              848      822 stefan       Src\Forms\obj\Release\res_3.cache
               848      820 harry        Src\Forms\obj\Release\res_4.resources
               848      820 harry        Src\Forms\obj\Release\res_5.resources

wobei das M tatsächlich auch da ist.

Nun würde ich die Informationen gerne in eine neue Datei schreiben, die dann in etwa so aussehen soll.

   Repository revision:	820 	Src\Forms\obj\Release\res_1.resources
   Repository revision:	820 	Src\Forms\obj\Release\res_2.resources
   Repository revision:	822  	Src\Forms\obj\Release\res_3.cache
   Repository revision:	820 	Src\Forms\obj\Release\res_4.resources
   Repository revision:	820 	Src\Forms\obj\Release\res_5.resources

Weiß jemand Rat?

Danke und Gruß,
Mario

Content-Key: 143737

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

Printed on: April 25, 2024 at 06:04 o'clock

Member: TsukiSan
TsukiSan May 28, 2010 at 09:14:37 (UTC)
Goto Top
Hallo Mario,

gesetz dem Fall, dein Dateiaufbau ist immer so und es gibt nur so ein vereinsamtes "M", dann
könnte dir dieses Schnipsel in VBS eventuell weiterhelfen:
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set MeineDatei = FSO.OpenTextFile("D:\3\Test.txt", 1)  
MeineDateiNeu = MeineDatei.ReadAll
MeineDateiNeu = Replace (MeineDateiNeu, "M              848" , "               Repository revision:")  
MeineDateiNeu = Replace (MeineDateiNeu, "848" , "Repository revision:")  
MeineDatei.Close
Set MeineDatei = FSO.CreateTextFile("D:\3\Test1.txt", True)  
With MeineDatei
	.Write (MeineDateiNeu)
	.Close
End With

Gruss
Tsuki
[Edit]
Bitte bei dem Schnipsel noch den Pfad und Dateinamen anpassen
[/Edit]
Mitglied: 77559
77559 May 28, 2010 at 09:17:04 (UTC)
Goto Top
Hallo Mario,

die genauen Offset,Länge Werte und Anzahl Leerzeichen musst du dir selber raussuchen.

@Echo off&Setlocal
Set InFile=D:\Test\test1.txt
Set OutFile=D:\test\Test2.txt
For /F "delims=" %%A in (%InFile%) do Set "Line=%%A" & Call :ProcLine  
Goto :Eof
:ProcLine
>> %OutFile% Echo.   Reposi... %Line:~25,3%  %Line:~41%

Aber du kannst ja zählen/ablesen face-wink
         1         2         3         4         5         6         7         8      
12345678901234567890123456789012345678901234567890123456789012345678901234567890
               848      820 harry        Src\Forms\obj\Release\res_1.resources
               848      820 harry        Src\Forms\obj\Release\res_2.resources
M              848      822 stefan       Src\Forms\obj\Release\res_3.cache
               848      820 harry        Src\Forms\obj\Release\res_4.resources
               848      820 harry        Src\Forms\obj\Release\res_5.resources
               
         1         2         3         4         5         6         7         8      
12345678901234567890123456789012345678901234567890123456789012345678901234567890
   Repository revision:	820 	Src\Forms\obj\Release\res_1.resources
   Repository revision:	820 	Src\Forms\obj\Release\res_2.resources
   Repository revision:	822  	Src\Forms\obj\Release\res_3.cache
   Repository revision:	820 	Src\Forms\obj\Release\res_4.resources
   Repository revision:	820 	Src\Forms\obj\Release\res_5.resources

Gruß
LotPings
Member: Mario.Steinberg
Mario.Steinberg May 28, 2010 at 10:44:59 (UTC)
Goto Top
Wow, danke für die schnellen Antworten.

ich habe mich für die Variante von LotPings entschieden

For /F "delims=" %%A in (%VDD_TEMP%) do Set "Line=%%A" & Call :ProcLine   
Goto :Eof 
:ProcLine 
>> %VDD_FILE% Echo.   Repository revision: %Line:~25,3%  %Line:~41%
:Eof 

Was genau macht Goto :Eof ? Musste ich das Label tatsächlich noch ergenzen?

Ich habe folgendes geschrieben:

For /F "delims=" %%A in (%VDD_TEMP%) do Set "Line=%%A" & Call :ProcLine   
Goto :Eof 
:ProcLine 
>> %VDD_FILE% Echo.   Repository revision: %Line:~25,3%  %Line:~41%
:Eof 

rm %VDD_TEMP%

Es scheint als ob das rm jetzt in der Schleife aufgerufen wird!??

Gibt es eine Möglichkeit den Ausdruck ohne die Funktion :ProcLine zu schreiben z.B.

For /F "delims=" %%A in (%VDD_TEMP%) do (  
   Set "Line=%%A" & Call :ProcLine   
   >> %VDD_FILE% Echo.   Repository revision: %Line:~25,3%  %Line:~41%
)

rm %VDD_TEMP%

Würde auch

echo Repository revision: %Line:~25,3%  %Line:~41% >> %VDD_FILE%

funktionieren?

Was macht der . hinter Echo?

Danke und Gruß,
Mario
Member: Mario.Steinberg
Mario.Steinberg May 28, 2010 at 11:37:13 (UTC)
Goto Top
So gehts:

For /F "delims=" %%A in (%VDD_TEMP%) do (
set "Line=%%A"
echo Repository revision: !Line:~23,4! !Line:~40! >> %VDD_FILE% 2<&1
)

rm %VDD_TEMP%
Mitglied: 77559
77559 May 28, 2010 at 11:56:09 (UTC)
Goto Top
Zitat von @Mario.Steinberg:
Was genau macht Goto :Eof ? Musste ich das Label tatsächlich noch ergenzen?
Nein :Eof ist ein Standardmäßig gesetzter Label für End of File.
Ein goto :Eof (!wichtig! mit Doppelpunkt) bewirkt einen Rücksprung aus einer Sub oder das Ende des Hauptteils.
Es verhindert hier das der Haupteil in die Sub durchläuft.


Ich habe folgendes geschrieben:

> For /F "delims=" %%A in (%VDD_TEMP%) do Set "Line=%%A" & Call :ProcLine   
> Goto :Eof 
> :ProcLine 
> >> %VDD_FILE% Echo.   Repository revision: %Line:~25,3%  %Line:~41%
> :Eof 
> 
> rm %VDD_TEMP%
> 

Es scheint als ob das rm jetzt in der Schleife aufgerufen wird!??
Ja, ein Label wird nur als Ansprungmarke benutzt, und hat sonst keine Funktion.
(Es wird mit :: auch häufig als Kommentar "missbraucht" )

Gibt es eine Möglichkeit den Ausdruck ohne die Funktion :ProcLine zu schreiben z.B.

Ja, hast du ja schon herausgefunden. Du brauchst dafür Setlocal EnableldelayedExpansion und bekommst ggfs. mit Ausrufezeichen im Text Probleme.

Würde auch
> echo Repository revision: %Line:~25,3%  %Line:~41% >> %VDD_FILE%
> 
funktionieren?
JA, aber nur innerhalb der Schleife oder innerhalb einer von dort aufgerufenen Sub, da sich der Wert ja mit jeder Zeile der gelesenen Datei ändert.
Was macht der . hinter Echo?
Das ist nur ein alternativer Befehlstrenner (statt Leerzeichen gehen auch .,;;\/ und soll das Zählen der Leerzeichen erleichtern, da der Trenner ja nicht mitgezählt wird.

Gruß
LotPings