gnlen1
Goto Top

Batsch doppelte Zeile in in Text finden und eine löschen

Hallo zusammen.

Ich habe noch nicht so viel Erfahrung mit batch.
Ich will eine Textdatei (oder optional alle Datein in einem Ordner) Zeile für Zeile durchsuchen.
Stehen zwei exakt gleiche Zeilen untereinander will ich eine der Zeilen löschen (bzw beim neuschreiben weglassen).

Vielen Dank für eure Hilfe und die Unterstützung die ihr in diesem Forum anbietet.

Content-Key: 328387

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

Printed on: April 26, 2024 at 15:04 o'clock

Member: Kraemer
Kraemer Feb 03, 2017 at 11:46:37 (UTC)
Goto Top
Moin,

nimm lieber Powershell. Damit ist das schnell erledigt.

Siehe hier

Gruß Krämer
Mitglied: 132272
132272 Feb 03, 2017 updated at 11:48:52 (UTC)
Goto Top
Wenn man "Batsch" richtig schreiben würde, fände man das hier und x mehr...
Mit Batchdatei aus einer .txt doppelte Zeilen löschen

Gruß
Member: GNLen1
GNLen1 Feb 03, 2017 at 12:01:29 (UTC)
Goto Top
Oh stimmt sorry für die Rechtschreibung.

Hab den Beitrag schon gelesen. Mir geht es aber nicht darum in der ganzen Datei nach doppelten einträgen zu suchen, sondern nur Doppelte einträge die genau untereinander stehen. In dem unteren Beispiel soll am Ende aus den letzen fünf </Data> am ende eines übrig bleiben.


<Data name="nSpeed" access="public" xsi:type="collection" type="num">
<Value key="AccelMax" value="100" />
<Value key="DecelMax" value="100" />
<Value key="Auto" value="100" />
<Value key="Grip" value="10" />
<Value key="Home" value="5" />
<Value key="Flex" value="50" />
<Value key="fromPLC" value="99" />
</Data>
<Data name="nWaitDistTeach" access="public" xsi:type="array" type="num" size="1">
<Value key="0" value="10" />
</Data>
<Data name="pT1S1" access="public" xsi:type="collection" type="pointRx">
</Data>
</Data>
</Data>
</Data>
</Data>
Mitglied: 132272
132272 Feb 03, 2017 updated at 12:04:56 (UTC)
Goto Top
XML Dateien sind ungeeignet für Batch-Processing schon wegen UTF8 und co., dazu nimmt man den XML-Parser in Powershell...

p.s. und ich seh da nichts doppeltes ...
Mitglied: 130834
130834 Feb 03, 2017 at 12:11:40 (UTC)
Goto Top
p.s. und ich seh da nichts doppeltes ...

Ich schon...

</Data>
</Data>
</Data>
</Data>
</Data>
Mitglied: 132272
132272 Feb 03, 2017 updated at 12:16:14 (UTC)
Goto Top
jetzt schon, vorher war das nicht da face-wink hat sich wohl beim Posten überschnitten.

Da hat wohl so ein "Intelligenzbolzen" das File nicht mit einem vernünftigen objektorientierten XML-Parser bearbeitet X-) dann wäre so eine Überarbeitung erst gar nicht nötig.

War er wahrscheinlich selber face-big-smile >>> Suchen ersetzen mit Sonderzeichen
Member: GNLen1
GNLen1 Feb 03, 2017 at 12:27:02 (UTC)
Goto Top
Ja richtig war ich selbst. Tut mir leid, ich komme nicht aus der Pc-Programmierung, sondern aus der Industrie..(Microcontroller, SPS, Roboter,...).
Wenn ich ein Informatiker wäre bräuchte ich ja eure Hilfe nicht....
Bisher funktionert alles, bis auf das oben genannte Problem.
Mitglied: 132272
132272 Feb 03, 2017 updated at 16:00:18 (UTC)
Goto Top
Dann poste doch mal das Ausgangsprodukt wo noch alles aus dem Original vorhanden ist. Dann schreibst du was mit dem Dokument exakt gemacht werden soll dann können wir dir vernünftigen Code schreiben der das XML als Object behandelt und der das was du nicht daraus brauchst vernünftig und vor allem vollständig entfernt, dann ist diese Nacharbeits-Krücke mit den überfälligen Endtags erst gar nicht nötig! So ist das absolutes "Flickwerk" mit dem du in Zukunft kein vernünftiges Ergebnis erzielst.
Wenn du aus einer anderen Branche kommst dann solltest du unseren Empfehlung auch Gehör schenken, denn nicht alles was man manchen kann ist in dem Sinne auch sinnvoll, und so wie ich das hier sehe ist der Fehler einfach aus Unwissenheit entstanden. Das können wir dir durch Alternativen definitiv verbessern.
Das hier mit Batch auszubügeln halte ich definitv für die falsche Entscheidung.

Zur Korrektur des obigen Beispiels z.B. ginge
@echo off
set "datei=D:\test.txt"  
powershell -Executionpolicy ByPass -Command "[regex]::matches((gc '%datei%' -Raw),'(?is)<Data .*?</Data>').Groups.Value | set-content '%datei%'"  
Aber wie gesagt wenn wir den ganzen Kontext kennen ließe sich das wesentlich professioneller lösen.
Member: GNLen1
GNLen1 Feb 03, 2017 at 16:45:00 (UTC)
Goto Top
Danke für den Anhaltspunkt. Die Ausgangsidee ist es automatisiert Programmiervorgänge vorzunehmen. Es wird ein "Formular" ausgefüllt. Anhand des Formulars werden die einzelnen Komponenten des Programmes zusammengestellt (Aus Vorlagen kopiert).
Ich erstelle anhand des Formulars eine Liste in der Suchen, Ersetzen Begriffe vorkommen. nun wird das Vorlage-Programm nach den Suchbegriffen durchsucht und ersetzt. Alle Suchbegriffe sind mit einem Zeichen gekennzeichnet. Im letzten Schritt werden alle Zeilen mit nicht ersetzen Begriffen gelöscht.
Das Programm funktioniert soweit, nur im letzten Schritt bleiben eben diese "Reste" übrig, da sie nicht mit dem Ersetzungszeichen gekennzeichnet sind. Dadurch ist die Programmstruktur zerstört und das Progamm nicht lauffähig.
Mitglied: 132272
132272 Feb 03, 2017 updated at 16:50:03 (UTC)
Goto Top
Wie gesagt das ist für eine XML-Datei eine gänzlich ungeeignete Vorgehensweise. XML Dateien sind hier sehr penibel zu betrachten!

Richtig machst du das indem man mit XPath die entsprechenden Knoten ausfiltert und dann komplett löscht! Helfen kann ich hier nur wenn man mal eine ganze Datei hätte.