alme123
Goto Top

Per Batch in Dateizeilen nach Strings alles löschen

Hallo zusammen,

ich habe folgendes Problem:

ich habe eine sehr lange TextDatei (ca. 1300 Zeilen) in der folgendes steht (sehr kleiner Ausschnitt):

language.name=Deutsch
language.region=Deutschland
language.code=de_DE

gui.done=Fertig
gui.cancel=Abbrechen
gui.back=Back
gui.toMenu=Zurück zum Hauptmenü
gui.up=Hoch
gui.down=Runter
gui.yes=Ja
gui.no=Nein

Ein Batch (oder Vbscript) soll in allen Zeilen die "=" enthalten alles nach dem Gleichzeichen entfernen.

So sollte es danach aussehen:

language.name=
language.region=
language.code=

gui.done=
gui.cancel=
gui.back=
gui.toMenu=
gui.up=
gui.down=
gui.yes=
gui.no=


Vielen Dank im Vorraus,

Alme123

Content-Key: 206931

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

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

Member: Endoro
Endoro May 23, 2013 updated at 17:54:31 (UTC)
Goto Top
Hallo Alme123,

wenn das nur ein kleiner Ausschnitt ist, was steht im restlichen Text: sind die Zeichenketten vor dem = unique? Gibts noch wo anders equal signs?

Gruss!
Member: Alme123
Alme123 May 23, 2013 at 17:58:14 (UTC)
Goto Top
@Endoro

ja alle Zeichen vor dem = sind "normale" Textzeichen (also UTF-8 ohne BOM).
Nach dem = gibt es Sonderzeichen, vorher nicht.

Alme123
Member: rubberman
rubberman May 23, 2013 updated at 18:35:26 (UTC)
Goto Top
Hallo Alme123,

könnte so funktionieren:
@echo off &setlocal
set "txtfile=test.txt"  
set "newfile=neu.txt"  

setlocal EnableDelayedExpansion
<"!txtfile!" >"!newfile!" (  
  for /f %%i in ('type "!txtfile!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln=" &set /p "ln="  
    if defined ln (
      for /f "delims==" %%k in ("!ln!") do echo %%k=  
    ) else (
      echo(
    )
  )
)

Grüße
rubberman
Member: Endoro
Endoro May 23, 2013 updated at 21:20:12 (UTC)
Goto Top
Ich hab es mal mit sed gebaut. Es wird eine Sicherheitskopie .bak angelegt:

@echo off&setlocal
sed  -i.bak "s/=.*/=/" file.txt  

Gruss!

PS: @rubberman: ich weiss ja nicht, ob @Alme123 Sonderzeichen im Text hat. Aber nachdem dein Code drübergelaufen ist, könnten es einige weniger sein face-wink
Member: rubberman
rubberman May 23, 2013 at 20:06:48 (UTC)
Goto Top
Hallo Endoro,

Sonderzeichen würde ich nicht unbedingt vor dem = erwarten. Falls doch, findet sich auch dafür eine Lösung face-smile

Grüße
rubberman
Member: bastla
bastla May 23, 2013 at 20:33:51 (UTC)
Goto Top
... und wenn's ein VBScript ist face-wink:
Ein = "D:\test.txt"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbNewline & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbNewline & Z
    End If
Next

fso.CreateTextFile(Aus).Write Mid(N, 3)
Grüße
bastla
Member: Alme123
Alme123 May 24, 2013 updated at 03:21:26 (UTC)
Goto Top
@rubberman , @bastla und @Endoro

leider macht mir @rubberman 's Script mir die Datei kaputt (entfernt einfach Satzteile mit . vor dem =)
@bastla 's Script fängt nur die ersten Zeilen an und meint Feierabend zu haben.

@Endoro
sed möchte einfach nicht funktionieren, ich habe Windows 7 64 Bit.

Alme123
Member: bastla
bastla May 24, 2013 updated at 07:09:11 (UTC)
Goto Top
Hallo Alme123!
... fängt nur die ersten Zeilen an und meint Feierabend zu haben.
Du hast ja auch nur die ersten Zeilen gepostet ... face-wink

Was passiert denn genau, bis zu welcher Zeile (mit welcher Besonderheit) wird verarbeitet?

[Edit] Sollte Unicode ein Faktor sein, kannst Du es mit dieser Variante versuchen:
Ein = "D:\test.txt"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein, 1, 0, 1).ReadAll, vbNewLine)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbNewline & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbNewline & Z
    End If
Next

fso.CreateTextFile(Aus, 2, 1, 1 ).Write Mid(N, 3)
[/Edit]

Grüße
bastla
Member: Endoro
Endoro May 24, 2013 updated at 06:17:56 (UTC)
Goto Top
Zitat von @Alme123:
@Endoro
sed möchte einfach nicht funktionieren, ich habe Windows 7 64 Bit.

Hallo Alme123,

der Pfad zur sed.exe muss im Script oder dem %path% eingefügt werden.

Gruss!
Member: Alme123
Alme123 May 24, 2013 at 11:49:21 (UTC)
Goto Top
@bastla

Fehler in deinem "Edit" Script: Zeile 6 Zeichen 1: Ungültiger Prozeduraufruf oder ungültiges Argument. Code: 800A0005

Die Datei sieht so aus: http://wormstates.pytalhost.com/de_DE.lang
Datei herunterladen und so bitte testen.


Alme123
Member: Friemler
Friemler May 24, 2013, updated at May 25, 2013 at 13:11:53 (UTC)
Goto Top
Hallo Alme123,

noch eine Powershell-Lösung gefällig?
$inFile = "D:\test.txt"  
$outFile = "D:\neu.txt"  

$regExp = new-object System.Text.RegularExpressions.Regex("(\S+=)(\S+)")  

if (test-path $outFile)
{
  remove-item $outFile
}

foreach ($line in get-content $inFile -encoding UTF8)
{
  $matches = $regExp.match($line)
  $newLine = ""  
  
  if ($matches.success)
  {
    $newLine = $matches.groups[1].captures.toString()
  }

  out-file -inputObject $newLine -encoding UTF8 -append $outFile
}

Ergebnis ist eine UTF8-Datei mit BOM. Wenn in Zeile 21 UTF8 durch Default ersetzt wird, wird eine ANSI-Datei geschrieben.


[EDIT]
... und wenn eine UTF8-Datei ohne BOM ausgegeben werden soll:
$inFile = "D:\test.txt"  
$outFile = "D:\neu.txt"  

$crlf = [System.Environment]::NewLine
$newContent = ""  

foreach ($line in get-content $inFile -encoding UTF8)
{
  if ($line.Contains("="))  
  {
    $newContent += $line.Split("=") + "=" + $crlf  
  }
  else
  {
    $newContent += $line + $crlf
  }
}

$encoding = new-object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllText($outFile, $newContent, $encoding)
Diese Version arbeitet auch schneller, weil die Ausgabedatei in einem Stück geschrieben wird.
[/EDIT]


Gruß
Friemler
Member: Alme123
Alme123 May 24, 2013 at 12:40:57 (UTC)
Goto Top
@Friemler

danke, dein Script funktioniert! (Mit der http://wormstates.pytalhost.com/de_DE.lang Datei)

Danke auch an @bastla und @rubberman ,

Friemler's Script funktionierte beim ersten mal perfekt (bei mir hat es erst so funktioniert: Powershell(.exe) öffnen und "Set-ExecutionPolicy RemoteSigned" eingeben)


Alme123

[Theard closed]
Member: Friemler
Friemler May 24, 2013 at 12:47:57 (UTC)
Goto Top
Hallo Alme123,

man kann das Script auch so aufrufen:
 powershell -nologo -executionpolicy remotesigned -file "Scriptpfad.ps1"
Dadurch wird die Ausführung von Powershell-Scripts nur temporär erlaubt.

Gruß
Friemler
Member: bastla
bastla May 24, 2013 at 14:32:36 (UTC)
Goto Top
Hallo Alme123!

Wenn Du gleich den Link zu dieser Datei gepostet hättest, anstatt alle Beteiligten raten zu lassen, ob und welche Formatierung / Sonderzeichen zu berücksichtigen wären (mein Script ist daran gescheitert, dass keine "Windows"-Zeilenschaltungen mit CR + LF, sondern nur LF verwendet werden), wäre das Thema gestern schon durch gewesen ...

... nicht zuletzt mit dieser Script-Version:
Ein = "D:\de_DE.lang"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, vbLf)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbLf & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbLf & Z
    End If
Next

fso.CreateTextFile(Aus).Write Mid(N, 2)

Grüße
bastla
Member: Endoro
Endoro May 24, 2013 at 15:01:20 (UTC)
Goto Top
Hallo Alme123,

läuft mit sed auch prima in gefühlt 1/100 sec. durch face-smile

Gruss!