haberl92
Goto Top

Zwei Textdateien vergleichen und bearbeiten

Hallo zusammen,

ich habe zwei Text-Dateien(.txt), welche ich miteinander abgleichen soll.
Gibt es da in Powershell eine einfache Möglichkeit?

Die Dateien sehen ungefähr so aus:

ident

Nun möchte ich nach gleichen Nummern suchen (aber nur die 12-stellige Nummer) und diese ganze Zeile dann nachher aus der zweiten Textdatei löschen.

PS: das ";;2;;;" muss nicht immer 2 sein. Es können zahlen von 1 bis 22 sein.

Content-ID: 1594031171

Url: https://administrator.de/forum/zwei-textdateien-vergleichen-und-bearbeiten-1594031171.html

Ausgedruckt am: 22.12.2024 um 21:12 Uhr

149569
Lösung 149569 06.12.2021 um 21:17:03 Uhr
Goto Top
$f1 = gc .\datei1.txt | %{$_.Split(';')}  
gc .\datei2.txt | ?{$_.Split(';') -notin $f1} | sc .\datei2_neu.txt  
Haberl92
Haberl92 06.12.2021 um 21:39:52 Uhr
Goto Top
Zitat von @149569:

> $f1 = gc .\datei1.txt | %{$_.Split(';')}  
> gc .\datei2.txt | ?{$_.Split(';') -notin $f1} | sc .\datei2_neu.txt  
> 

Hallo Hacktor,
du bist ja schon wieder meine Rettung ;)
Heute schaffe ich es nicht mehr.
Ich werde den Code morgen mal testen.
Haberl92
Haberl92 07.12.2021 um 17:18:15 Uhr
Goto Top
@149569

Es hat wunderbar funktioniert. Hab nur noch den Pfad ändern müssen, da das Script nicht im selben Ordner liegt.
Mich hat zuerst nur gc und sc verwirrt. Wusste nicht, dass man die Befehle abkürzen kann. Ich habe sie immer ausgeschrieben.

Vielen Dank
Haberl92
Haberl92 08.12.2021 um 20:58:19 Uhr
Goto Top
Noch eine Frage: gibt es da eventuell eine "schnellere" Möglichkeit?
Da ich momentan eine Textdatei mit 140.000 Zeilen habe und diese mit einer 700.000 Zeilen abgleichen soll und da braucht das Script recht lange.
Es arbeitet jetzt schon eine Stunde und keine Ahnung wie lange es noch dauert.
149569
149569 08.12.2021, aktualisiert am 09.12.2021 um 16:29:49 Uhr
Goto Top
Import-Csv und Compare-Object sind alternativ deine Freunde.
=> Hausaufgabe für dich 😉

Falls du spicken willst, bitte:
https://tio.run/##jZBRS8MwFIXf@ysuZZBNSFky3UuZForInhQqvo7a3tlo2tQ004nzt9 ...
Haberl92
Haberl92 09.12.2021 aktualisiert um 18:34:09 Uhr
Goto Top
Zitat von @149569:

Import-Csv und Compare-Object sind alternativ deine Freunde.
=> Hausaufgabe für dich 😉

Falls du spicken willst, bitte:
https://tio.run/##jZBRS8MwFIXf@ysuZZBNSFky3UuZForInhQqvo7a3tlo2tQ004nzt9 ...

Dein Beispiel ist schon nicht schlecht. Nur sollte in der ersten Textdatei (f1.txt) alles stehen bleiben und nur in der zweiten die Zeilen entfernt werden.


Nächstes Problem ist, dass die Zahlen zwischen den Semikolon (;;1bis22;;;) öfter vorkommen und danach sollte nicht gefiltert werden.
Beziehungsweise müsste es mit ";;1;;;" einmal umgedreht passieren,
Die Zahlen soll aus der ersten Datei gelöscht werden
(beziehungsweise ersetzt durch die gleiche Zahl mit ;;2;;; aus der zweiten Datei und dann aus der zweiten gelöscht werden)(nicht alle ;;1;;; ersetzen)
Und zum Schluss sollten beide zusammengefügt werden
Beispiel:

Text1:
123456;;1;;;
234567;;2;;;
345678;;5;;;
890123;;5;;;

Text2:
123456;;2;;;
234567;;8;;;
456789;;22;;;
789012;;8;;;

Output (zusammen):
123456;;2;;; (ersetzt durch Text2) (hier wegen ;;1;;;)
234567;;8;;; (ersetzt durch Text2)
345678;;5;;; (Original aus Text1)
456789;;22;;; (Original aus Text2)
789012;;8;;; (Original aus Text2)
890123;;5;;; (Original aus Text1)

Also bei deinen Beispiel wäre der ideale Output:
11111;;10;;;
22222;;11;;;
33333;;12;;;
44444;;13;;;
55555;;10;;;
66666;;22;;;

hier wäre ";;10;;;" zweimal vorhanden und das müsste so sein.
Es soll also nur die erste Zahl verglichen werden, diese kann aber hinten jeweils eine andere haben.
Haberl92
Haberl92 09.12.2021 aktualisiert um 21:30:55 Uhr
Goto Top
also kurz gesagt, müsste alles was in Text1 mit ;;2;;; bis ;;22;;; steht aus Text2 gelöscht werden (wobei die ;;$;;;-Zahl in beiden nicht identisch ist, nur der vordere Teil)

Und im Text1 müssten alle Zahlen mit ;;1;;; durch die, die in Text2 enthalten sind, ersetzt werden.
(oder in Text1 gelöscht werden, da sie später zusammengefügt werden)

Problematisch wird es auch, da manchmal noch eine Zahl dabei sein kann und noch ein paar Zeichen
Beispiel:
hier wäre natürlich die erste Zahl wichtig und die letzte (07, 07, 17)
149569
149569 09.12.2021 aktualisiert um 21:36:00 Uhr
Goto Top
Zitat von @Haberl92:

Zitat von @149569:

Import-Csv und Compare-Object sind alternativ deine Freunde.
=> Hausaufgabe für dich 😉

Falls du spicken willst, bitte:
https://tio.run/##jZBRS8MwFIXf@ysuZZBNSFky3UuZForInhQqvo7a3tlo2tQ004nzt9 ...

Dein Beispiel ist schon nicht schlecht. Nur sollte in der ersten Textdatei (f1.txt) alles stehen bleiben und nur in der zweiten die Zeilen entfernt werden.

Genau das macht mein Beispiel ja!! Solltest du dir also nochmal genau ansehen 😉.
Es werden nur die Einträge aus Datei2 übernommen die nicht in Datei1 vorkommen.


Nächstes Problem ist, dass die Zahlen zwischen den Semikolon (;;1bis22;;;) öfter vorkommen und danach sollte nicht gefiltert werden.
Das interessiert das Skript ja überhaupt nicht denn du wolltest ja laut deiner Aussage nur die Zahl aus der ersten Spalte berücksichtigen, genau das macht das Skript, es vergleicht ausschließlich nur die erste Spalte!

Beziehungsweise müsste es mit ";;1;;;" einmal umgedreht passieren,
Die Zahlen soll aus der ersten Datei gelöscht werden
Nun widersprichst du dir selbst, oben wolltest du das nur aus der zweiten Datei Zeilen entfernt werden!

Das wird mir jetzt ehrlich gesagt mal wieder zu blöd, Auftragsarbeiten bitte gerne an den Dienstleister deiner Wahl richten.

Tschö mit ö
Haberl92
Haberl92 09.12.2021 um 21:45:01 Uhr
Goto Top
Ich glaube, da ist compare-object an seinen Grenzen.

Idee meinerseits:
Beide Textdateien zu neuer zusammenfügen, den hinteren Teil vorerst löschen, doppelte Einträge entfernen und dann jede Zeile in den Originaldateien suchen lassen,
bei anderen (;;2;;; usw...) String aus der ersten Datei zufügen
und bei keiner Übereinstimmung der vorderen Zahlen (also wenn die Zahl nur in der zweiten Datei existiert) den String aus der zweiten Datei zufügen


nur da bin ich komplett überfordert. mit compare-object hab ich mich jetzt schon ein wenig anvertraut
Haberl92
Haberl92 09.12.2021 um 21:54:20 Uhr
Goto Top
Zitat von @149569:

Zitat von @Haberl92:

Zitat von @149569:

Import-Csv und Compare-Object sind alternativ deine Freunde.
=> Hausaufgabe für dich 😉

Falls du spicken willst, bitte:
https://tio.run/##jZBRS8MwFIXf@ysuZZBNSFky3UuZForInhQqvo7a3tlo2tQ004nzt9 ...

Dein Beispiel ist schon nicht schlecht. Nur sollte in der ersten Textdatei (f1.txt) alles stehen bleiben und nur in der zweiten die Zeilen entfernt werden.

Genau das macht mein Beispiel ja!! Solltest du dir also nochmal genau ansehen 😉.
Es werden nur die Einträge aus Datei2 übernommen die nicht in Datei1 vorkommen.

OK. Das habe ich falsch verstanden. Nach erneutem Ansehen, verstehe ich es.

Nächstes Problem ist, dass die Zahlen zwischen den Semikolon (;;1bis22;;;) öfter vorkommen und danach sollte nicht gefiltert werden.
Das interessiert das Skript ja überhaupt nicht denn du wolltest ja laut deiner Aussage nur die Zahl aus der ersten Spalte berücksichtigen, genau das macht das Skript, es vergleicht ausschließlich nur die erste Spalte!

Das habe ich jetzt auch kapiert, ist auch wie oben... Jetzt verstehe ich es
Beziehungsweise müsste es mit ";;1;;;" einmal umgedreht passieren,
Die Zahlen soll aus der ersten Datei gelöscht werden
Nun widersprichst du dir selbst, oben wolltest du das nur aus der zweiten Datei Zeilen entfernt werden!

Das mit der ;;1;;; ist leider noch dazu gekommen. und das verkompliziert die Sache ungemein. Siehe Post weiter oben.
Das wird mir jetzt ehrlich gesagt mal wieder zu blöd, Auftragsarbeiten bitte gerne an den Dienstleister deiner Wahl richten.
Ich will es ja lernen, wenn ich es nur in Auftrag gebe, kann ich es später auch nicht. Ich will es verstehen, aber mir fehlen die Grundkenntnisse. Jetzt zum Beispiel hast du mir compare-object gezeigt und ich habe mich mit dem Code auseinander gesetzt und ihn großteils verstanden.