Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Zwei Textdateien miteinander zeilenweise parallel vergleichen

Frage Entwicklung Batch & Shell

Mitglied: dedalus2011

dedalus2011 (Level 1) - Jetzt verbinden

15.07.2012, aktualisiert 15:54 Uhr, 3426 Aufrufe, 9 Kommentare

Ich habe eine Textdatei1, die ich mit einer anderen Textdatei2 vergleichen möchte. Die Zeilen sind in den Dateien gleich angeordnet. Also möchte ich jede Zeile aus Textdatei1 mit den Zeilen aus Textdatei2 parallel vergleichen. Ist die Zeile vorhanden, soll die nicht überschrieben werde Ist sie nicht vorhanden, soll die geschrieben werden. Mit geschachtelten for-schleifen,etwa durch

01.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Textdatei2%"')  
02.
do (for /f "tokens=1* delims=:" %%j in ('findstr /n "^" "%Textdatei1%"') do set "Zeile=%%j" && echo %%i && call :Line) 
geht nicht, da die Indexes von den zwei for schleifen nicht parallel verarbeitet werden können. Gibt's da Workarounds? Ideen?

Also so ungefähr:

Textdatei2.txt:

1. String_A
2. String_B
3. String_C

Textdatei1.txt:

1. String_A
2. String_C

Also wenn die erste Zeile von der Textdatei2 (1.String_A) die gleiche ist wie diejenige von Textdatei1(1.String_A) dann soll die Zeile von der Textdatei 1 nicht überschrieben werden sonst soll sie überschrieben werden.

Wenn die zweite Zeile von der Textdatei2 (1.String_B) die gleiche ist wie diejenige von Textdatei1(1.String_C) dann soll die Zeile von der Textdatei 1 nicht überschrieben werden sonst soll sie überschrieben werden.

..usw

Danke für Eure Tipps

Gruß
dedalus2011
Mitglied: bastla
15.07.2012, aktualisiert um 17:46 Uhr
Hallo dedalus2011!

Könntest Du vielleicht noch erklären, was mit "soll/soll nicht überschrieben werden" gemeint ist und was eigentlich das gewünschte Ergebnis (ebenfalls beispielhaft dargestellt) wäre?

Interessieren könnte Dich aber jedenfalls der Beitrag Zwei Texte Zeilenweise zusammenfügen per batch ...

Grüße
bastla
Bitte warten ..
Mitglied: Darkprodukt
15.07.2012, aktualisiert um 18:12 Uhr
Hallo dedalus2011,

soweit ich das jezt erkenne würde doch danach Datei1 genauso wie Datei2 aussehen, oder?

Naja einfach ausgedrückt, du Überschreibst Datei1 mit Datei2.
Ist viel einfacher als ein Zeilenvergleich.

Grüße
Darkprodukt
Bitte warten ..
Mitglied: dedalus2011
15.07.2012 um 18:15 Uhr
das alles ist Teil eines Skripts der Zeilen von der Textdatei 2 in die Textdatei1 nur dann zurückschreiben soll wenn diese Zeilen in der Textdatei1 nicht mehr vorhanden sind. Die Anordnung der Zeilen in der Textdatei2 soll dabei erhalten sein.

Der Skript soll aber keine Zeilen in der Textdatei 1 überschreiben wenn diese bereits da sind.

Es ist eine Art "restore" aber ohne unnötiges Überschreiben/Verarbeiten. Es sind Textdateien die eine sehr hohe Anzahl an Zeilen haben und mit "findstr" verarbeitet werden. Dadurch dass die Zeilen die bereits da sind nicht mehr verarbeitet werden könnte die Laufzeit verbessern. Meine Überlegung halt...Geht das irgendwie?

Danke für jeglichen Hinweis

Gruß
dedalus2011
Bitte warten ..
Mitglied: Darkprodukt
15.07.2012, aktualisiert um 18:23 Uhr
Naja wo wir gerade von Laufzeit sprechen.

Mir wurde gesagt das jeder Aufruf von finstr ~250ms Dauert.
Da erscheint mir ein einfaches überschreiben sehr viel einfacher.

Abgesehen davon.
In deinem Beispiel fehlt der Datei1 ja der String_B also würde der String_C ja mit String_B überschrieben werden.
Jezt wird danach auf String_C gestestet, der aber nicht mehr existiert, also würde String_D mit String_C überschrieben werden.

etc.pp.

Ich kan einfach nur empfehlen. Überschreib die Datei einfach.

Textdatein sind meistens nicht 1GB groß. Das ist nehmlich meist die Zeit wo das Warten vom Kopiervorgang nervt.

Grüße
Darkprodukt
Bitte warten ..
Mitglied: bastla
15.07.2012 um 18:23 Uhr
Hallo dedalus2011!

Das klingt dann aber für mich so, wie es Darkprodukt schon interpretiert hat - soll demnach als Ergebnis der Inhalt der Textdatei 1 jenem von Textdatei 2 entsprechen (gleiche Zeilen bleiben unverändert, fehlende Zeilen werden ergänzt) oder kann es dann doch noch Unterschiede geben (weil etwa in Textdatei 1 Zeilen enthalten waren, die es in Textdatei 2 nicht gibt)?

Grüße
bastla
Bitte warten ..
Mitglied: dedalus2011
15.07.2012, aktualisiert um 19:17 Uhr
Sorry,da habe ich mich falsch ausgedrückt. Der Skript verteilt aus der Ursprungsdatei (Textdatei2) Zeilen in verschiedenen Dateien (aufwändige "findstr" Operationen). Durch einen Systemausfall könnte z.B. die Ausführung des Skripts abgebrochen werden und die Zieldateien (Textdatei1 und Textdatei2) bleiben unvollständig.

Ein restore durch ein einfaches überschreiben der Dateien mit der Ursprungsdatei ist daher keine Option. Meine Frage ist ja ob es möglich wäre die lange Laufzeit einer erneuten Ausführung des Skripts dadurch zu vermeiden, indem man zuerst prüft ob die Zeilen bereits da sind.

Eine mögliche Verteilung könnte so aussehen:

Ursprungsdatei.txt:

1. String_A
2. String_B
3. String_C

Textdatei1.txt:

1. String_A
2. String_C - fehlt, konnte wegen Skriptabbruch nicht geschrieben werden

Textdatei2.txt
2. String_B


Angenommen Textdatei1.txt konnte wegen einem Skriptabbruch nicht komplett geschrieben werden (z.B. string_C fehlt), sollte jetzt ein restore zuerst prüfen welche Zeilen aus der ersten (und der zweiten Textdatei) bereits vorhanden sind und von der Ausführungslogik der Filterung ausgeschlossen werden können (es sollen also keine teuren "findstr" operationen mehr ausgeführt werden für diese zeilen).
In dem Fall,würde die Filterung nur auf den fehlenden String_C angewandt.

Geht das irgendwie? Wenn nötig kann ich den kompletten Skript hier posten


Gruß
dedalus2011
Bitte warten ..
Mitglied: Darkprodukt
15.07.2012 um 19:32 Uhr
Ok,

Also soll die Batch jede Zeile von Ursprungsdatei.txt Prüfen und feststellen ob diese sich in Textdatei1.txt oder Textdatei2.txt befindet.

Sobald eine Zeile Fehlt, kan das Script abbrechen und dem lengen Verteilerscript
die Zeile mitteilen an der es Fortfahren soll.

Richtig?
Bitte warten ..
Mitglied: dedalus2011
15.07.2012 um 20:22 Uhr
Ja, das wäre die Idee.. Wäre super wenn es klappen würde

Gruß
dedalus2011
Bitte warten ..
Mitglied: Darkprodukt
16.07.2012, aktualisiert um 14:22 Uhr
Ok,

Es wäre dann Hilfreich, wenn du den Quellcode des verteilers Posten würdest.

Dann wird dabei Warscheinlich auch die Frage geklärt, wie man die Zeilennummer an dieses Weitergibt.

Grüße
Darkprodukt
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Windows Server
AD-Berechtigungen von zwei Servern miteinander vergleichen (3)

Frage von s0m3ting zum Thema Windows Server ...

Batch & Shell
gelöst Textdateien vergleichen BATCH (2)

Frage von FeudelFred zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - Dateien aus verschiedenen Arrays - Attribute vergleichen (5)

Frage von Giffas zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...