bellamiiii
Goto Top

Batch zum vergleichen von text Dateien

Hallo,

ich bin leider im Scripte schreiben nicht der beste, also versuch ich mal mein Glück bei euch =).

Ich möchte gerne eine Batch Datei die 2 Texte miteinander vergleicht bzw die Zeilen sollen verglichen werden.
Wenn etwas in der selben Zeile schon drin steht, kann diese übersprungen werden und sollte eine Zeile in a.txt fehlen und b.txt vorhanden
sein, soll diese bitte in a kopiert werden. Das sollte nach Möglichkeit bis zum Ende beider Dateien durchgeführt werden.

b.txt soll die Vergleichsdatei sein und a.txt die angepasste/ergänzte sein (beides aus Verzeichnissen bitte)
zur Veranschaulichung:


A.txt

Test a = 1
Test a = 2
Test a = 3

B.txt

Test b = 1
Test b = 2
Test b = 3
Test b = 4

Nun fehlt in A.txt "Test b = 4" diese soll bitte in A.txt an der selben stelle hinein kopiert werden.
Hättet ihr dafür eine Lösung ? ^^ würde mich freuen

Grüße

Content-Key: 491524

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

Printed on: May 28, 2024 at 21:05 o'clock

Member: 1st1
1st1 Sep 04, 2019 at 13:52:17 (UTC)
Goto Top
Das kennst du?

fc /?
Vergleicht zwei Dateien oder zwei Sätze von Dateien und zeigt die
Unterschiede zwischen ihnen an.


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]][/T] [/U] [/W] [/nnnn]
[Laufwerk1:][Pfad1]Dateiname1[Laufwerk2:][Pfad2]Dateiname2
FC /B [Laufwerk1:][Pfad1]Dateiname1 [Laufwerk2:][Pfad2]Dateiname2

/A Zeigt nur die erste und letzte Zeile jedes Satzes von
Unterschieden an.
/B Führt einen binären Vergleich durch.
/C Vergleicht ohne Rücksicht auf Groß-/Kleinschreibung.
/L Vergleicht Dateien als ASCII-Textdateien.
/LBn Stellt die maximale Zahl aufeinander folgender, unterschiedlicher
Zeilen auf die angegebene Anzahl n ein.
/N Zeigt bei einem ASCII-Vergleich die Zeilennummern an.
/OFF[LINE] Überspringt keine Offlinedateien.
/T Expandiert Tabulatorzeichen nicht zu Leerzeichen.
/U Vergleicht Dateien als UNICODE-Textdateien.
/W Komprimiert Tabulatoren und Leerzeichen für den Vergleichsvorgang.
/nnnn Anzahl aufeinander folgender Zeilen, die nach einem Unterschied
wieder übereinstimmen müssen.

[Laufwerk1:][Pfad1]Dateiname1
Gibt die erste Datei bzw. ersten Dateisatz zum Vergleichen an.
[Laufwerk2:][Pfad2]Dateiname2
Gibt die zweite Datei bzw. zweiten Dateisatz zum Vergleichen an.
Member: Pjordorf
Pjordorf Sep 04, 2019 at 13:54:31 (UTC)
Goto Top
Hallo,

Zitat von @Bellamiiii:
Ich möchte gerne eine Batch Datei die 2 Texte miteinander vergleicht bzw die Zeilen sollen verglichen werden.
In dein Beispiel ist grundsätzlich jede Zeile unterschiedlich, soll also alles dann auch in a.Text rein kopiert werden. Denn Test a=1 ist ungleich Test b=1.

Gruß,
Peter
Mitglied: 140913
140913 Sep 04, 2019, updated at Sep 05, 2019 at 05:30:33 (UTC)
Goto Top
@echo off
set "file1=C:\datei1.txt"  
set "file2=C:\datei2.txt"  
powershell -Executionpolicy ByPass -NoP -C "Compare (gc '%file1%') (gc '%file2%') -IncludeEqual -PassThru | sort | sc '%file1%'"  
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 04:12:27 (UTC)
Goto Top
Hallo,

nein so ist es nicht gedacht . Es soll nur herausgefunden werden ob im Vergleich der beiden Dateien die selben Zeilen schon
mit Inhalten beschrieben sind.Wenn in Zeile 25 in b.txt was drin steht, aber in a.txt diese Zeile fehlt muss diese in a kopiert werden.
Nach Möglichkeit sollte dann der Vorgang des auslesens von vorn begonnen werden, da sich ja für den Rest des Dokumentes die Zeilennummern geändert haben.

Gruß
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 04:20:25 (UTC)
Goto Top
Hallo psuser,

leider führte deine Variante dazu, dass die aus b.txt eingefügten Beispiele i.wo am Ende in a.txt eingefügt wurden ^^

Grüße
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 04:22:29 (UTC)
Goto Top
Zitat von @1st1:

Das kennst du?

fc /?



Hallo user28929,

wie gesagt Scripte sind nicht ganz so meins =D, daher kenne ich auch den vollen Umfang derer nicht so bzw wüsste ich nicht wie
ich die in etwas funktionierendes Umwandeln könnte


Grüße
Mitglied: 140913
140913 Sep 05, 2019 updated at 06:53:57 (UTC)
Goto Top
Nein wird es nicht, es wird in der Reihenfolge abgelegt wir in deinem Beispiel, ansonsten unzureichende Infos zum Abgleich
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 07:21:54 (UTC)
Goto Top
wie du in dem Ersten Anhang siehst habe ich in mitten der b.txt Datei eine zeile hinzugefügt und nun schreibt er diese in der a.txt genau ans Ende.
Ich muss die Möglichkeit haben da wo jetzt "hallo" steht immer weitere Einträge machen zu können und diese dann kopieren in a.txt.

Grüße
unbenannt
unbenannt2
Mitglied: 140913
140913 Sep 05, 2019 updated at 07:30:53 (UTC)
Goto Top
Immer noch zu ungenau spezifiziert, so?
https://tio.run/##K8gvTy0qzkjNyfn/XyVRwVbBUMdIx0THTMfQQMcQyDbSMTbmUkmCSh ...

BTW. Die Vorgehensweise ist wirklich Bullshit. Nimm ne XML oder ne INI oder ne CSV als Datenbasis, das Zeilengedöns fällt dir ganz sicher bald auf die Füße.
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 08:15:50 (UTC)
Goto Top
Es handelt sich um eine INI Datei. Ich dachte nur es würde keinen Unterschied machen wenn ich es mit txt beschreibe ^^ Sry dafür.

durch unseren externen Programmierer sind wir auf eine INI Datei für unsere Programme angewiesen . Durch unsere Produktion
kommen nun immer mehr Anforderungen an das Programm und diese beinhalten immer mehr INI-Einträge an bestimmten stellen und um dieses mühselige hinzufügen des neuen Eintrages zu umgehen (was ja für jede Station gemacht werden muss) würde ich das gerne schnell Updaten mit einer Batch.

Daher wäre es einfacher wenn das Programm durchläuft
1. jede Zeile "scant" und wenn in der Zeile was drin steht, kann die übersprungen werden
2. sollte aber in INI2 (neue INI des Programmierers) in Zeile z.B. 25 ein neuer Eintrag stehen und in INI1 (welche auf dem Rechner ist) die Zeile
25 leer sein .. soll die aus 2 in 1 kopiert werden
3. das Programm nicht einfach beendet wird sondern nochmal von vorne scant bis zur nächsten leeren Zeile und um zu vermeiden, dass der neue Eintrag in einer Zeile nicht zu Problemen führt oder es fängt von der zuletzt hinzugefügten Zeile wieder an zu vergleichen ... je nachdem was einfacher wäre

ist die "Anforderung" an das Programm besser zu verstehen ?=)
Mitglied: 140913
140913 Sep 05, 2019 updated at 08:39:07 (UTC)
Goto Top
INI Files haben einen anderen Aufbau da funktioniert dein Vorhaben nicht da jede Sektion auch gleichnamige Einträge aufweisen darf und die Sektionen an beliebiger Stelle stehen dürfen, deshalb behandelt man INI-Dateien anders, z.B. mit den passenden Funktionen:
Arbeiten mit INI Files in VBScript
Da durchläuft man jede Section und vergleicht die Section mit der der anderen Datei und bei Bedarf fügt man dann eine fehlende Property hinzu oder eben nicht.
Member: Bellamiiii
Bellamiiii Sep 05, 2019 at 08:43:25 (UTC)
Goto Top
sieht schon mal nicht übel aus

könntest du mir den Syntax in eine Batch packen ?

Ich habe mich beim Programmieren immer nur durchgemogelt =D

Grüße
Mitglied: 140913
140913 Sep 05, 2019 updated at 09:08:30 (UTC)
Goto Top
Machs gleich mit der Powershell (kannst du bei Bedarf ja aus deiner Batch heraus aufrufen):
$pathA = 'D:\a.ini'  
$pathB = 'D:\b.ini'  

function Get-IniContent([string]$ini){
    $dic = [ordered]@{}
    $content = gc $ini -raw
    if ($content -ne $null){
        [regex]::matches($content,'(?ism)^\[(?<Sectionheader>[^\]]+)\]\s*(?<Sectionbody>.*?(?=(^\[|\Z)))').Captures | ?{$_.Success} | %{  
            $props = [ordered]@{}
            $_.Groups['Sectionbody'].Value -split '[\r\n]+' | ?{$_ -match '='} | %{  
                $line = $_.split('=')  
                $props.($line.trim()) = $line[1].trim().trim('"')  
            }
            $dic.($_.Groups['Sectionheader'].Value) = $props  
        }
    }
    return $dic
}

function Set-IniContent($hashtable,$path){
    $out = @()
    $hashtable.GetEnumerator() | %{
        $out += "[" + $_.Key + "]"  
        $_.Value.GetEnumerator() | %{
            $out+= $_.Key + "=" + $_.Value  
        }
        $out += ""  
    }
    $out | sc $path
}


$a = Get-IniContent $pathA
$b = Get-IniContent $pathB

foreach($section in $b.GetEnumerator()){
    foreach($prop in $section.Value.GetEnumerator()){
        if ($prop.Name -notin $a[$section.Name].Keys){
            $a[$section.Name][$prop.Name] = $prop.Value
        }
    }
}

Set-IniContent -hashtable $a -Path $pathA
Member: miniversum
miniversum Sep 05, 2019 at 12:27:42 (UTC)
Goto Top
Hallo,

nutze doch Winmerge.
Du kannst es auch per Batch ansprechen. Die Parameter dafür findest Du hier: http://manual.winmerge.org/Command_line.html
Ich denke das auto-merge am ende ist das was du tun willst?

Gruß
...
Member: Bellamiiii
Bellamiiii Sep 09, 2019 at 12:17:37 (UTC)
Goto Top
hy psuser,

sry für die späte Meldung, aber ich hatte keine Zeit mehr um ins Forum reinzuschauen.

Ich habe die Namen der ini´s , die am Anfang verlangt werden mit dem richtigen Pfad angegeben.
Wenn ich das ganze ausführe passiert mit beiden Daeien nichts... keine Veränderung in beiden

Grüße
Mitglied: 140913
140913 Sep 09, 2019 updated at 12:32:59 (UTC)
Goto Top
Klappt hier einwandfrei, sind deine Dateien und der uns unbekannte Inhalt. Ich bin raus, hab jetzt kein Bock noch 10 mal nach dem Inhalt und Format zu fragen. Bei einer regulär und nach Vorschrift definierten INI funktioniert es problemlos, sorry.

Ciao.