itchley
Goto Top

Erstes Zeichen oder gezielt Anführungszeichen entfernen

Moin zusammen,

ich scheitere seit Stunden an dem Versuch, aus einer txt-Datei via batch Anführungszeichen zu entfernen. Die Datei sieht Beispielhaft so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
<numRiRecs>2</numRiRecs>
  <RiRec>
   <rirecIP>192.168.253.11</rirecIP>
    <rirecName>KR16</rirecName>
     <caLo>
"      <CaLo>  
        <iPosRels>
          <CImagePosRel>
            <asCo>
              <xC>58400</xC>
              <yC>5850</yC>
              <zC>562</zC>
            </asCo>
        </transMatrx>
      </CaLoc>
"  
"      <CaLoc>  
        <iPosRels>
          <CImagePosRel>
...
Die Datei besteht aus mehreren 100.000 Zeilen.
Egal was ich hier oder anderswo mit google gefunden habe, führte nicht zum Erfolg.
Da die Anführungszeichen wenn sie auftauchen immer ganz vorne und alle Zeilen insgesamt mindestens ein Leerzeichen vorne stehen haben, habe ich u.a. auch versucht Zeilenweise auszulesen, dabei das erste Zeichen zu überspringen und in eine Zieldatei zu schreiben. Egal wie...es will nicht klappen.

Danke schonmal für Tipps

Gruß
Itchley

Content-ID: 2245529245

Url: https://administrator.de/forum/erstes-zeichen-oder-gezielt-anfuehrungszeichen-entfernen-2245529245.html

Ausgedruckt am: 08.04.2025 um 21:04 Uhr

117471
117471 21.03.2022 um 23:44:23 Uhr
Goto Top
Hallo,

Du könntest z.B. mit einem x-beliebigen Texteditor die Zeichenkette Leerzeichen-Anführungszeichen durch ein einzelnes Leerzeichen ersetzen.

Unter Linux ginge das auch mit sed.

Gruß,
Jörg
rubberman
Lösung rubberman 22.03.2022, aktualisiert am 23.03.2022 um 00:52:04 Uhr
Goto Top
Ich nehme an, so sollte das mit Batch pur funktionieren (wenn das auch nicht mehr zeitgemäß ist).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
:: @echo off
@echo on
setlocal

set "file=foo.xml"  

setlocal EnableDelayedExpansion
>nul chcp 65001
set quote="  
<"!file!" >"!file!.~tmp" (  
  echo off
  for /f %%i in ('type "!file!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln="&set /p "ln="  
    if "!ln:~,1!"=="!quote!" (  
      echo(!ln:~1!
    ) else (
      echo(!ln!
    )
  )
)
move /y "!file!.~tmp" "!file!"  
endlocal
Das chcp 65001 ändert das Encoding zu UTF-8, was üblich (Standard) für XML Daten ist.
Die letzte Zeile überschreibt die ursprüngliche Datei. Kannst du auch erst mal weglassen, um das Ergebnis zu begutachten.

Steffen
em-pie
em-pie 22.03.2022 um 08:23:26 Uhr
Goto Top
Moin,

ich würde das mit der Powershell lösen:
1
2
$xml = "C:\test\MyFile.xml"  
(Get-Content -Path $xml) -replace "`"","" | Out-File -FilePath $xml  

Beachte das Zeichen "Backtick (`)" im Replace. das sorgt dafür, dass das zu ersetzende Zeichen (hier: ") escaped wird. Das Symbol selbst erzeugst du mit [Shift] und [´] (links, neben der Backspace-Taste)

Gruß
em-pie
Itchley
Itchley 22.03.2022 um 08:25:52 Uhr
Goto Top
Moin,

ja, leider möchte bzw. muss es via batch laufen. Ein Suchen und Ersetzen mit einem Editor wie z.b. Notepad++ ist unpraktisch, da diese Arbeit häufiger durchgeführt werden muss und in der Rohdatei auch noch andere Elemente angepasst werden müssen (das hab ich auch geschafft).
@rubberman
Ich teste im Laufe des Tages deinen Lösungsvorschlag und melde mich dann nochmal - trotzdem schon einmal Danke.
@117471
Die Idee mit sed hätte mir auch mal kommen können...im Netzwerk gibt es immer Linux-Systeme und somit wäre der Umweg darüber dann mit sed auch eine Methode

Vielleicht war ich gestern auch zu weit geistig umnachtet

Danke

Beste Grüße
Itchley
1915348599
1915348599 22.03.2022 aktualisiert um 10:55:48 Uhr
Goto Top
Die Idee mit sed hätte mir auch mal kommen können...
Und gerade bei großen Dateien im Speed so gut wie kaum schlagbar.

Inplace Ersetzung bspw. so
1
sed -rie 's/^(\s*)"/\1/' datei.xml  
sed läuft ja nativ auch auf Windosen wenn man unbedingt will/muss ...
rubberman
rubberman 22.03.2022 um 14:10:08 Uhr
Goto Top
Zitat von @Itchley:
da diese Arbeit häufiger durchgeführt werden muss
Autsch. Und es gibt keine Möglichkeit die Ursache statt der Symptome zu bekämpfen?

Steffen
Itchley
Itchley 22.03.2022 aktualisiert um 23:50:11 Uhr
Goto Top
Moin in die Runde,

vielleicht etwas dünn am Anfang erläutere ich es nun hoffentlich schlüssig:
  • Die Rohdatei wird anhand von variablen Parametern erstellt
  • Das bestehende System wird aktuell komplett neu entwickelt und daher in Zukunft abgelöst
  • Dennoch wird das aktuelle System meine Kollegen und mich vermutlich noch ca.10Jahre begleiten
  • Das neue System hat also (hoffentlich) das Symptom nicht mehr
  • Das "Problem" ist zwar schon lange bekannt, aber in all den Jahren bisher haben meine Kollegen viele Sachen mühselig mit Abschreiben (Papier zu Papier), berechnen (Papier -> Taschenrechner -> Papier) und selber Umschreiben (Papier in Programm, Programm nach xml) gelöst

Also die Ursache wird bearbeitet, das Altsystem wird jedoch nicht mehr angepasst...

Ich bin diese Woche ausnahmsweise mit den Kollegen auf der Baustelle unterwegs und sehe halt diese "analoge Zettelwirtschaft" - im Grunde hab ich alles gelöst bis auf die Anführungszeichen

Nach Möglichkeit möchte ich rein mit Windows Bordmitteln auskommen und das auch mobil ohne Netzwerkanbindung (also kein Linux mit sed) schaffen. Powershell müsste ich schauen, leider gibt es noch richtig alte Systeme.

@rubberman
Habe deinen Vorschlag eingebaut. Leider sieht das Ergebnis nicht so aus wie gewünscht
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
        <iPosRels>

D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
          <CImagePosRelation>

D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
            <asCo>

D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
              <xC>0</xC>

D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
              <yC>0</yC>

D:\Pfad\Pfad\Pfad Pfad\Pfad>(set "ln="  & set /p "ln="    
 if "!ln:~,1!" == "!quote!" (echo(!ln:~1! )  else (echo(!ln! ) )   
              <zC>0</zC>
In der Zieldatei steht nun der Pfad, dann etwas vom Befehl und dann das was ich brauche (tatsächlich) ohne Anführungszeichen.
Ich bin seit 7Uhr hier mit auf den Beinen und sehe den Fehler nicht...naja, hab es vorher auch nicht alleine geschafft. Bin also für Hilfe dankbar.


Schönen Abend noch

Gruß
Itchley
rubberman
rubberman 23.03.2022 um 00:45:44 Uhr
Goto Top
Kleine Ursache, große Wirkung: Prompt und die Wiederholung der Kommandozeilen müssen per echo off ausgeschaltet sein, sonst werden sie mit in die Datei umgeleitet. Ich ändere das oben im Script mal so, dass das auch noch funktioniert, wenn für den Rest des Scripts echo on spezifiziert wurde.

Steffen
Itchley
Itchley 23.03.2022 um 08:27:15 Uhr
Goto Top
@rubberman

oh man...ich Depp...

Während meiner Odyssee auf der Suche nach der Lösung habe ich in dem Bereich echo on geschaltet und hier und da mal ein timeout um zu sehen ob und ggf. was er macht um vielleicht auf eventuelle Fehler zu stoßen. Das echo on war immer noch aktiv - hab es rausgeschmissen und nun läuft es einwandfrei.

Besten Dank nochmal


Gruß
Itchley
rubberman
rubberman 23.03.2022 um 12:13:30 Uhr
Goto Top
Eines sollte ich noch erwähnen:
Die Technik, die Datei mit set /p zu lesen, hat den Vorteil, dass nicht ständig zwischen Enable/DisableDelayedExpansion hin und her gewechselt werden muss. Dass würde die Laufzeit des Scripts bei hunderttausenden von Zeilen nämlich ins Unendliche anwachsen lassen. Der Nachteil ist, dass nur Zeilen bis zu einer Länge von 1021 Bytes sicher gelesen werden. In den meisten Fällen sollte das nicht der Fall sein, allerdings kenne ich deine Daten nur von deinem Beispiel...

Ist halt unendlich schwer, Batchcode zu schreiben, der einigermaßen verlässlich funktioniert, bei all den Bugs und Unzulänglichkeiten die man dazu kennen und zum Teil gezielt ausnutzen muss. Es hat ganz reale Gründe, warum Batch für Produktivcode nicht mehr verwendet werden sollte. Auch wenn sich die meisten Leute hier auf nichtssagende Erklärungen beschränken, die etwa so aussehen:
ohyoubatch
face-big-smile
Steffen