viking
Goto Top

In Textdatei per batch Zeilenumbrüche bei definiertem Zeichen durchführen lassen.

Hallo, hab nun schon lange gesucht, aber noch nichts passendes gefunden.

Ich möchte per batch in einem Textfile jedes mal wenn ein bestimmtes Zeichen steht, in meinem Fall ein "@", einen Zeilenumbruch im Textfile durchführen lassen.

Wie kann ich das lösen?

Meine Datei heißt "Test.txt" und liegt auf c:\Temp


Gruß viking
Kommentar vom Moderator Biber am 13.07.2010 um 15:02:31 Uhr
Da viking es per Batch (oder evtl. VBSkript?) machen möchte -> verschoben von "Tools & Utilities" nach "Batch & Shell".

Content-ID: 146815

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

rubberman
rubberman 13.07.2010 um 15:54:54 Uhr
Goto Top
Hallo viking,

mit Batch könnte das so gehen:

Test.txt
Wo@sind@die@Umbrüche?

Hier@sind@sie.

Replace.bat
@echo off &setlocal
set "file=C:\Temp\Test.txt"  

set "tmpfile=%temp%\neu.tmp"  
>"%tmpfile%" type nul  
for /f "delims=: tokens=1*" %%a in ('findstr /n "^" "%file%"') do (  
  set "line=%%b"  
  call :proc
)
move /y "%tmpfile%" "%file%"  
goto :eof

:proc
if not defined line (
  >>"%tmpfile%" echo.  
  goto :eof
)
set "line=%line:@=&echo.%"  
>>"%tmpfile%" (echo.%line%)  
goto :eof

Grüße
rubberman
mathe172
mathe172 13.07.2010 um 18:55:31 Uhr
Goto Top
Und wenn das nicht funtioniert, versuch mal
@echo on & setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (  
set Text=!Text!@%%i
)
echo\"!Text!">Zwischenspeicher.txt  
:weiter
for /f "tokens=1* delims=@" %%i in (Zwischenspeicher.txt) do (  
echo\%%~i>>Test2.txt
set uebrig=%%~j
if "!uebrig!"=="" goto ende  
echo\!uebrig!>Zwischenspeicher.txt
)
goto weiter
:ende

Mathe172
viking
viking 13.07.2010 um 23:30:01 Uhr
Goto Top
Hallo rubberman,
bei Deiner Version tut sich gar nichts bei mir.

Gemäß dem Beispiel oben sollte dann im neuen Textfile stehen:
Wo
sind
die
Umbrüche?

Hier
sind
sie.

Gruß Viking
viking
viking 13.07.2010 um 23:37:02 Uhr
Goto Top
Zitat von @mathe172:
Und wenn das nicht funtioniert, versuch mal
> @echo on & setlocal enabledelayedexpansion
> for /f "delims=" %%i in (test.txt) do (  
> set Text=!Text!@%%i
> )
> echo\"!Text!">Zwischenspeicher.txt  
> :weiter
> for /f "tokens=1* delims=@" %%i in (Zwischenspeicher.txt) do (  
> echo\%%~i>>Test2.txt
> set uebrig=%%~j
> if "!uebrig!"=="" goto ende  
> echo\!uebrig!>Zwischenspeicher.txt
> )
> goto weiter
> :ende
> 

Mathe172


Hallo Mathe172,

bei Deiner Lösung tut sich zwar was, ... er werden 2 Dateien erzeugt.
Aber der Inhalt von Test2.txt ist nur ein Teil von der Ursprungsdatei und es wird wohl nicht jedes "@" berücksichtigt.
In meiner Datei kann in einer Zeile öfter das "@" vorkommen.

Gruß viking
rubberman
rubberman 13.07.2010 um 23:43:05 Uhr
Goto Top
Hallo viking,

bei mir funktioniert das komischerweise problemlos. Für den Fall dass C:\Temp\Test.txt letztlich nicht der Pfad ist und irgendwo Leerzeichen enthalten sind, habe ich oben im Code mal Anführungszeichen hinzugefügt...
BTW Der Code überschreibt die ursprüngliche Datei.

Grüße
rubberman
viking
viking 14.07.2010 um 00:00:42 Uhr
Goto Top
Hallo rubberman,

habe nun eine andere Lösung im Netz gefunden.


in UltraEdit kannst du im Search and Replace Fenster unter Replace ein ^p eintragen, dann erhältst du einen Zeilenumbruch.


Danke für alle die sich einen Kopf gemacht haben.

viking
rubberman
rubberman 14.07.2010 um 00:44:51 Uhr
Goto Top
Da gibt's so einige Editoren, die das können. Hatte sich aber so angehört, als wolltest du das automatisieren.

Einen hab ich noch:
Speichere mal folgenden Code als Xchange.vbs
Option Explicit

' Syntax:  
'   
' Xchange.vbs Filename -Option1 Old -Option2 New  
'   
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
'   
' Option1/Option2 | Old/New  
' ----------------|------------------------------------------------  
' -L              | any literal expression, like a word or letter  
'                 |  
' -C              | use VB constants:  
'                 |      "Tab"  tab  
'                 |      "CrLf" Windows line break  
'                 |      "Cr"   carriage return  
'                 |      "Lf"   line feed  
'                 |  
' -H              | HEX code for any character  
'   
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
'   
' Example Calls:  
'   
' Xchange.vbs "C:\test.txt" -l ";" -c "tab"  
' will replace semicolons with tabs in C:\test.txt  
'   
' Xchange.vbs "C:\test.txt" -h "3F" -l "!"  
' will replace Character 3F (question mark) with exclamation marks  
'   
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
'   
' Return Code (Errorlevel):  
'   
' 2 Syntax Error  
' 1 File not found  
' 0 No Error  

On Error Resume Next
Dim strFile, optF, xFind, optR, xReplace, fso, text

If Not WScript.Arguments.Count = 5 Then WScript.Quit (2)

strFile = WScript.Arguments(0)
optF = WScript.Arguments(1)
xFind = WScript.Arguments(2)
optR = WScript.Arguments(3)
xReplace = WScript.Arguments(4)

Select Case UCase(optF)
  Case "-L"  
  Case "-H"  
    xFind = ChrW(CLng("&H" & xFind))  
  Case "-C"  
    If UCase(xFind) = "TAB" Then  
      xFind = vbTab
    ElseIf UCase(xFind) = "CRLF" Then  
      xFind = vbCrLf
    ElseIf UCase(xFind) = "CR" Then  
      xFind = vbCr
    ElseIf UCase(xFind) = "LF" Then  
      xFind = vbLf
    Else
      WScript.Quit 2
    End If
  Case Else
    WScript.Quit 2
End Select

Select Case UCase(optR)
  Case "-L"  
  Case "-H"  
    xReplace = ChrW(CLng("&H" & xReplace))  
  Case "-C"  
    If UCase(xReplace) = "TAB" Then  
      xReplace = vbTab
    ElseIf UCase(xReplace) = "CRLF" Then  
      xReplace = vbCrLf
    ElseIf UCase(xReplace) = "CR" Then  
      xReplace = vbCr
    ElseIf UCase(xReplace) = "LF" Then  
      xReplace = vbLf
    Else
      WScript.Quit 2
    End If
  Case Else
    WScript.Quit 2
End Select

If Not Err.Number = 0 Then WScript.Quit 2

Set fso = CreateObject("Scripting.FileSystemObject")  
text = fso.OpenTextFile(strFile, 1).ReadAll
If Not text = "" Then  
  fso.CreateTextFile(strFile).Write Replace(text, xFind, xReplace)
End If
Set fso = Nothing
If Err.Number = 0 Then
  WScript.Quit 0
Else
  WScript.Quit 1
End If
Sorry für die englische Beschreibung am Anfang (ist nicht das erste Forum in dem ich den Code poste).

Nun kannst du leicht folgenden Aufruf aus einer Batchdatei machen:
Xchange.vbs "C:\Temp\Test.txt" -l "@" -c "crlf"  

Grüße
rubberman
viking
viking 14.07.2010 um 01:06:35 Uhr
Goto Top
Zitat von @rubberman:
Da gibt's so einige Editoren, die das können. Hatte sich aber so angehört, als wolltest du das automatisieren.

Einen hab ich noch:
Speichere mal folgenden Code als Xchange.vbs
> Option Explicit
> 
> ' Syntax:  
> '   
> ' Xchange.vbs Filename -Option1 Old -Option2 New  
> '   
> ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
> '   
> ' Option1/Option2 | Old/New  
> ' ----------------|------------------------------------------------  
> ' -L              | any literal expression, like a word or letter  
> '                 |  
> ' -C              | use VB constants:  
> '                 |      "Tab"  tab  
> '                 |      "CrLf" Windows line break  
> '                 |      "Cr"   carriage return  
> '                 |      "Lf"   line feed  
> '                 |  
> ' -H              | HEX code for any character  
> '   
> ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
> '   
> ' Example Calls:  
> '   
> ' Xchange.vbs "C:\test.txt" -l ";" -c "tab"  
> ' will replace semicolons with tabs in C:\test.txt  
> '   
> ' Xchange.vbs "C:\test.txt" -h "3F" -l "!"  
> ' will replace Character 3F (question mark) with exclamation marks  
> '   
> ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
> '   
> ' Return Code (Errorlevel):  
> '   
> ' 2 Syntax Error  
> ' 1 File not found  
> ' 0 No Error  
> 
> On Error Resume Next
> Dim strFile, optF, xFind, optR, xReplace, fso, text
> 
> If Not WScript.Arguments.Count = 5 Then WScript.Quit (2)
> 
> strFile = WScript.Arguments(0)
> optF = WScript.Arguments(1)
> xFind = WScript.Arguments(2)
> optR = WScript.Arguments(3)
> xReplace = WScript.Arguments(4)
> 
> Select Case UCase(optF)
>   Case "-L"  
>   Case "-H"  
>     xFind = ChrW(CLng("&H" & xFind))  
>   Case "-C"  
>     If UCase(xFind) = "TAB" Then  
>       xFind = vbTab
>     ElseIf UCase(xFind) = "CRLF" Then  
>       xFind = vbCrLf
>     ElseIf UCase(xFind) = "CR" Then  
>       xFind = vbCr
>     ElseIf UCase(xFind) = "LF" Then  
>       xFind = vbLf
>     Else
>       WScript.Quit 2
>     End If
>   Case Else
>     WScript.Quit 2
> End Select
> 
> Select Case UCase(optR)
>   Case "-L"  
>   Case "-H"  
>     xReplace = ChrW(CLng("&H" & xReplace))  
>   Case "-C"  
>     If UCase(xReplace) = "TAB" Then  
>       xReplace = vbTab
>     ElseIf UCase(xReplace) = "CRLF" Then  
>       xReplace = vbCrLf
>     ElseIf UCase(xReplace) = "CR" Then  
>       xReplace = vbCr
>     ElseIf UCase(xReplace) = "LF" Then  
>       xReplace = vbLf
>     Else
>       WScript.Quit 2
>     End If
>   Case Else
>     WScript.Quit 2
> End Select
> 
> If Not Err.Number = 0 Then WScript.Quit 2
> 
> Set fso = CreateObject("Scripting.FileSystemObject")  
> text = fso.OpenTextFile(strFile, 1).ReadAll
> If Not text = "" Then  
>   fso.CreateTextFile(strFile).Write Replace(text, xFind, xReplace)
> End If
> Set fso = Nothing
> If Err.Number = 0 Then
>   WScript.Quit 0
> Else
>   WScript.Quit 1
> End If
> 
Sorry für die englische Beschreibung am Anfang (ist nicht das erste Forum in dem ich den Code poste).

Nun kannst du leicht folgenden Aufruf aus einer Batchdatei machen:
> Xchange.vbs "C:\Temp\Test.txt" -l "@" -c "crlf"  
> 

Grüße
rubberman



Hallo rubberman,

das funktioniert nun bei mir auch.

Danke viking