magnuts
Goto Top

Zeilen in txt mit Batchskript aussortieren

Hallo zusammen,

Ich hab ein kleines Problem und würde mich über euere Hilfe freuen.

Das Ausgangsdokument um das es geht, behinhaltet etwa folgendes:

010-070200|Lorem ipsum dolor sit amet|
010-030160|consetetur sadipscing elitr|
020-070100|sed diam nonumy eirmod tempor|
010-070200|Lorem ipsum dolor sit amet|
020-070100|invidunt ut labore et dolore magna aliquyam erat|
020-040110|Stet clita kasd gubergren|
010-070100|sed diam voluptua|
010-030160|consetetur sadipscing elitr|

Mein Wunsch ist es nun, dieses Dokument mit Hilfe einer Batchdatei zu sortieren. Und zwar sollten Zeilen,
die mit der gleichen Nummer anfangen z.B. 010-070200, aus der Datei gelöscht werden (nur die Duplikate sollen gelöscht werden).
Wichtig ist, dass am Ende die Reihenvolge der Zeilen in der sie ursprünglich in dem Dokument standen weiterhin beibehalten wird.

Das heißt, dass das Dokument nach der durchlauf der Batch folgendermaßen aussehen sollte:

010-070200|Lorem ipsum dolor sit amet|
010-030160|consetetur sadipscing elitr|
020-070100|sed diam nonumy eirmod tempor|
020-040110|Stet clita kasd gubergren|
010-070100|sed diam voluptua|

Ich hoffe mir kann jemand bei dem Problem behilflich sein!

Danke und Gruß

Magnuts

Content-Key: 146902

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

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

Mitglied: 60730
60730 Jul 14, 2010 at 14:33:05 (UTC)
Goto Top
Moin,

  • kennst du sort /?
  • ist der Aufbau der Datei immer ???-??????|xyz?

Wenn ja - Lösung einfach

Gruß
Member: Magnuts
Magnuts Jul 14, 2010 at 14:53:38 (UTC)
Goto Top
Hallo TimoBeil,

Du hast recht, die Überschrift war wirklich schlecht gewählt!

Die Zahl am Anfang einer Zeile besteht immer aus 10 Zeichen.
Im Endeffekt sollte das Skript das File durchlaufen und alle Zeilen, in der die ersten 10 Zeichen schon einmal im Dokument vor kamen löschen.

Bei einem sort /+10 werden doch die Zeilen anhand der ersten 10 Zeichen verglichen und anschließend sortiert. Stimmt das soweit?
An sich wäre dies, das was ich brauche, doch sollte, wie erwähnt die Reihenfolge nicht verändert werden.

Entschuldigung für die anfänglichen Fehler meinerseits.

Gruß
Magnuts
Mitglied: 77559
77559 Jul 14, 2010 at 15:02:34 (UTC)
Goto Top
Hallo Magnuts,
geht viel einfacher auch ohne sortieren. (wenn auch nicht sehr effizient)

Die For Schleife trennt die Eingabezeile am | und prüft vor dem Schreiben in die neue Datei ob die Zahl dort schon vorkommt.
Wenn nicht, wird die aktuelle Zeile neu zusammengebaut und geschrieben.

:: Magnuts.cmd ::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings  administrator.de 2010-07-14
@echo off & setlocal EnableDelayedExpansion
Set Dok="Ausgang.txt"  
Set Neu="Neu.txt"  
Type NUL > %Neu%
For /F "Usebackq Tokens=1,2 delims=|" %%A in ( %Dok%   
  ) Do Findstr "%%A" %Neu% >NUL 2>&1 || >>%Neu% Echo.%%A^|%%B^|  
Das anschließend notwendige Umbenennen überlasse ich dir.

Gruß
LotPings
Mitglied: 60730
60730 Jul 14, 2010 at 15:36:39 (UTC)
Goto Top
Zitat von @77559:
Hallo Magnuts,
geht viel einfacher auch ohne sortieren. (wenn auch nicht sehr effizient)
@ lot - so einfach ist wohl nicht - die | gehören wohl zum Blindtext und nicht zur Aufgabe.
deswegen schrub ich ja "Lösung einfach" - aber im Moment hab ich was anderes um die Ohren...

Gruß
Mitglied: 77559
77559 Jul 14, 2010 at 15:44:01 (UTC)
Goto Top
Zitat von @60730:
@ lot - so einfach ist wohl nicht - die | gehören wohl zum Blindtext und nicht zur Aufgabe.
deswegen schrub ich ja "Lösung einfach" - aber im Moment hab ich was anderes um die Ohren...
Stimmt du hast ja senkrecht face-wink

Am Prinzip ändert es aber nichts:

:: Magnuts2.cmd ::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings  administrator.de 2010-07-14
@echo off & setlocal EnableDelayedExpansion
Set Dok="Ausgang.txt"  
Set Neu="Neu.txt"  
Type NUL > %Neu%
For /F "Usebackq delims=" %%A in ( %Dok%   
  ) Do Set "Line=%%A"&Findstr "!Line:~0,10!" %Neu% >NUL 2>&1 || >>%Neu% Echo.%%A  

Gruß
LotPings
Member: Magnuts
Magnuts Jul 15, 2010 at 12:14:46 (UTC)
Goto Top
Zitat von @60730:
@ lot - so einfach ist wohl nicht - die | gehören wohl zum Blindtext und nicht zur Aufgabe.
deswegen schrub ich ja "Lösung einfach" - aber im Moment hab ich was anderes um die Ohren...

Gruß

Zum Blindtext gehört es nicht direkt. Ich habe den Inhalt der txt sehr vereinfacht, um die Lösung dann selbstständig anzupassen.
Wahrscheinlich gestaltet sich das Problem dann aber doch etwas schwieriger, hier eine Zeile aus dem Dokument (die Pipes gehören tatsächlich in die Zeile):


Der Aufbau ist folgender:
10 Stellen -> Nummer, Pipe,Text, Pipe, Text, Pipe, Text, 15 x Pipe, Text, Pipe

d.h. nach 19 x Pipe kommt immer die nächste Zahl (in der nächsten Zeile)

Danke und Gruß
Magnuts
Mitglied: 77559
77559 Jul 15, 2010 at 12:46:24 (UTC)
Goto Top
Hallo Magnuts,
Ich versuche das mal in eine akzeptable Form zu übersetzen:

Liebe Leute vielen Dank für Eure Mühe, ich war wohl zu
[ _] blöd , [_] dumm, [_] ungschickt, [_] unerfahren - mein Problem von Anfang an präzise zu beschreiben,
und es tut mir Leid unnötigen Aufwand verursacht zu haben.

Die Batche funktionieren so nicht,
könnt ihr mir bitte nochmal unter Berücksichtigung der erst jetzt nachgereichten Fakten eine Lösung erarbeiten?

Falls das deine Zustimmung findet lass es und wissen .. und Tschüss LotPings ( es war/ist eine heiße Woche )
Member: Magnuts
Magnuts Jul 16, 2010 at 08:47:04 (UTC)
Goto Top
Zitat von @77559:
Liebe Leute vielen Dank für Eure Mühe, ich war wohl zu
[ _] blöd , [_] dumm, [_] ungschickt, [_] unerfahren - mein Problem von Anfang an präzise zu beschreiben,
und es tut mir Leid unnötigen Aufwand verursacht zu haben.

Die Batche funktionieren so nicht,
könnt ihr mir bitte nochmal unter Berücksichtigung der erst jetzt nachgereichten Fakten eine Lösung erarbeiten?

Ja, das findet Zustimmung meinerseits, [x]ungeschickt und [x]unerfahren würden an dieser Stelle meiner Meinung nach gut passen.

Tut mir Leid, wegen dem unnötigen Aufwand für euch. Ich dachte dass ich die Aufgabe etwas vereinfachen kann, aber im endeffeckt hab ich damit eine ganz andere Aufgabenstellung erzeugt. Ich bitte euch trotz den Missverständnissen und Fehlern meinerseits, mir eine kleine Hilfestellung zu dem Problem zu geben.

Gruß
Magnuts
Mitglied: 77559
77559 Jul 16, 2010 at 09:23:06 (UTC)
Goto Top
Hallo Magnuts,

Problem bei den bisherigen Batchversionen ist, das die Pipezeichen Escaped werden müssen, bei nur 2 kann man die nachbilden. Bei mehreren muss man das per Stringersetzung machen.
:: Magnuts3.cmd ::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings  administrator.de 2010-07-16
@echo off & Setlocal EnableDelayedExpansion
set Prompt=$G
Set Dok="Ausgang.txt"  
Set Neu="Neu.txt"  
Type NUL > %Neu%
For /F "Usebackq delims=" %%A in ( %Dok%   
  ) Do Set "Line=%%A"&Findstr "!Line:~0,10!" %Neu% >NUL 2>&1 || CAll :LineOut  
Goto :eof
:LineOut
Set "Line=%Line:|=^|%"  
>>%Neu% Echo.%Line%

Gruß
LotPings
Member: Magnuts
Magnuts Jul 23, 2010 at 11:01:22 (UTC)
Goto Top
Hallo LotPings,

Danke für deine Hilfe, hab das Problem in Griff bekommen! Läuft jetzt alles wie gewollt :D

Gruß
Magnus
Mitglied: 77559
77559 Jul 23, 2010 at 11:15:40 (UTC)
Goto Top
Hallo Magnuts,

so schön es ist, wenn ein Thema erledgt abgehakt werden kann, noch besser wäre es,
wenn du beschreibst was und wie dir Deine Lösung gelungen ist - Ratsuchende können es dann vielleicht auch nachvollziehen.

Gruß
LotPings