Zwei Dateien per Batch zusammenfügen
Hallo zusammen!
Ich stehe vor folgendem Problem:
Aus einem Programm erhalte ich zwei Logdateien. In der einen Datei steht, welcher User wann eine Änderung durchgeführt hat und in der anderen, welche Änderung es war. Ich würde nun gern beide Dateien zusammenführen, man sucht sich sonst einfach dumm und dämlich.
Datei 1 sieht folgendermaßen aus:
In den ersten beiden Zeilen steht, wann die Logdatei erstellt wurde. Wichtig wird es aber Zeile 3. Es gehören immer zwei Zeilen zusammen. In Zeile 3 stehen Datum und Uhrzeit, in Zeile 4 der angemeldete User und der Verweis, welche Zeilen in der zweiten Datei zu dieser Änderungen gehören. Gleiches für Zeile 5+6, 7+8 usw.
Die Datei 2 enthält jetzt nur die geänderten Werte, getrennt durch eine Leerzeile.
Ich möchte nun eine Ausgabe, die in etwa so aussehen soll:
Datei 1 hat die Endung .alg, Datei 2 die Endung .atx. Im Endeffekt sind es aber Textdateien, die normal mit dem Editor geöffnet werden können. Ein Umbenennen in .txt wäre kein Problem.
Ist das mit Batchdateien überhaupt möglich? Oder brauche ich dafür was ganz anderes?
Danke schon mal für Eure Hilfe!
Viele Grüße
Ines
Ich stehe vor folgendem Problem:
Aus einem Programm erhalte ich zwei Logdateien. In der einen Datei steht, welcher User wann eine Änderung durchgeführt hat und in der anderen, welche Änderung es war. Ich würde nun gern beide Dateien zusammenführen, man sucht sich sonst einfach dumm und dämlich.
Datei 1 sieht folgendermaßen aus:
[Wed Feb 19 20:22:42 2014]
Create Spreadsheet Update Log
[Thu Feb 20 09:44:11 2014]
Log Updates From User [ User1 ] Starting At Row [ 1 ] For A Total Of [ 4 ] Rows
[Thu Feb 20 09:46:14 2014]
Log Updates From User [ User1 ] Starting At Row [ 5 ] For A Total Of [ 2 ] Rows
[Thu Feb 20 09:46:14 2014]
Log Updates From User [ User2 ] Starting At Row [ 7 ] For A Total Of [ 16 ] Rows
In den ersten beiden Zeilen steht, wann die Logdatei erstellt wurde. Wichtig wird es aber Zeile 3. Es gehören immer zwei Zeilen zusammen. In Zeile 3 stehen Datum und Uhrzeit, in Zeile 4 der angemeldete User und der Verweis, welche Zeilen in der zweiten Datei zu dieser Änderungen gehören. Gleiches für Zeile 5+6, 7+8 usw.
Die Datei 2 enthält jetzt nur die geänderten Werte, getrennt durch eine Leerzeile.
"M1" "M2" "M3"
"P1" "P7" "Produkt"
"Kto1" "Konto" "Kto2"
"GJ" "M" "M12"
"Kto1" "Kto3" "Kto4" "Kto5"
Ich möchte nun eine Ausgabe, die in etwa so aussehen soll:
[Wed Feb 19 20:22:42 2014]
Create Spreadsheet Update Log
[Thu Feb 20 09:44:11 2014]
Log Updates From User [ User1 ] Starting At Row [ 1 ] For A Total Of [ 4 ] Rows
"M1" "M2" "M3"
"P1" "P7" "Produkt"
"Kto1" "Konto" "Kto2"
[Thu Feb 20 09:46:14 2014]
Log Updates From User [ User1 ] Starting At Row [ 5 ] For A Total Of [ 2 ] Rows
"GJ" "M" "M12"
"Kto1" "Kto3" "Kto4" "Kto5"
[Thu Feb 20 09:46:14 2014]
Log Updates From User [ User2 ] Starting At Row [ 7 ] For A Total Of [ 16 ] Rows
Datei 1 hat die Endung .alg, Datei 2 die Endung .atx. Im Endeffekt sind es aber Textdateien, die normal mit dem Editor geöffnet werden können. Ein Umbenennen in .txt wäre kein Problem.
Ist das mit Batchdateien überhaupt möglich? Oder brauche ich dafür was ganz anderes?
Danke schon mal für Eure Hilfe!
Viele Grüße
Ines
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 231829
Url: https://administrator.de/forum/zwei-dateien-per-batch-zusammenfuegen-231829.html
Ausgedruckt am: 09.01.2025 um 03:01 Uhr
8 Kommentare
Neuester Kommentar
Hallo Eisbrecherin!
Soferne VBS für Dich ok wäre, etwa so:
Grüße
bastla
Soferne VBS für Dich ok wäre, etwa so:
ALG = "Datei1.alg"
ATX = "Datei1.atx"
LG = "Datei1.log"
Header = 2 'Anzahl Koopfzeilen
Set fso = CreateObject("Scripting.FileSystemObject")
set rE = New RegExp
rE.Pattern = ".*\[ .+ \].+\[ (\d+) \].+\[ (\d+) \]"
rE.Global = True
ALGZ = Split(fso.OpenTextFile(ALG).ReadAll, vbNewline)
ATXZ = Split(fso.OpenTextFile(ATX).ReadAll, vbNewLine)
For i = 0 To UBound(ALGZ)
LOGZ = LOGZ & vbNewline & ALGZ(i)
If i >= Header And Left(ALGZ(i), 1) <> "[" Then
Set Matches = rE.Execute(ALGZ(i))
If Matches(0).SubMatches.Count = 2 Then
Von = Matches(0).SubMatches(0)
Anzahl = Matches(0).SubMatches(1)
WScript.Echo Von, Anzahl
For j = 0 To Anzahl - 1
LOGZ = LOGZ & vbNewline & ATXZ(Von + j)
Next
Else
WScript.Echo "Fehler in Zeile " & i + 1 & " !"
WScript.Quit 1
End If
End If
Next
fso.CreateTextFile(LG).Write Mid(LogZ, 3)
bastla
Hallo Ines,
und wenn's Powershell sein darf:
Grüße Uwe
und wenn's Powershell sein darf:
$file1 = gc "C:\datei1.alg"
$file2 = gc "C:\datei2.atx"
$fileMerged = "C:\merged.txt"
$newContent = ""
foreach($row in $file1){
if ($row -match "^Log Updates From"){
$regex = [regex] "\[ (\d+) \]"
$matches = $regex.Matches($row)
[int]$start = $matches.Groups[1].Value
[int]$len = $matches[1].Groups[1].Value
$newContent += $row + "`r`n"
for ($i = $start-1;$i -lt ($start-1+$len);$i++){
$newContent += $file2[$i] + "`r`n"
}
$newContent += "`r`n"
}else{
$newContent += $row + "`r`n"
}
}
$newContent | out-File $fileMerged
Hallo eisbrecherin!
Zur Zeile 15: Wenn die ALG-Datei mit einer Zeilenschaltung endet, ist die letzte Zeile leer - daher entweder, wie von Dir gelöst, immer auf das Verabeiten der letzten Zeile verzichten oder vorweg mit
sicher stellen, dass die Zeile mehr als "Nix" und ev ein(ige) Leerzeichen enthält.
Hinsichtlich des zweiten Problems kann ich nur raten, dass Deine Orignaldatei anders aussieht als die gepostete Kurzfassung (die ich als Basis für meinen Test verwendet habe) - anyhow: Die Schleife würde ich nicht zu ändern, sondern allenfalls die Zeile 24 auf
BTW: Mir fällt gerade auf, dass die Testausgabe in Zeile 22 noch enthalten ist - die kann natürlich weg ...
Grüße
bastla
[Edit] Nach genauerem Lesen: In Deinem ATX-Datei-Beispiel reichen die Blöcke von der Zeile 1 bis zur Zeile 4 und von Zeile 5 bis Zeile 7 (sollte ja eine Leerzeile sein); daher sollte der dritte Block erst bei Zeile 8 beginnen, in der ALG-Datei steht aber 7 und Zeilenanzahl 2 ... [/Edit]
Zur Zeile 15: Wenn die ALG-Datei mit einer Zeilenschaltung endet, ist die letzte Zeile leer - daher entweder, wie von Dir gelöst, immer auf das Verabeiten der letzten Zeile verzichten oder vorweg mit
If Trim(ALGZ(i)) <> "" Then
Hinsichtlich des zweiten Problems kann ich nur raten, dass Deine Orignaldatei anders aussieht als die gepostete Kurzfassung (die ich als Basis für meinen Test verwendet habe) - anyhow: Die Schleife würde ich nicht zu ändern, sondern allenfalls die Zeile 24 auf
LOGZ = LOGZ & vbNewline & ATXZ(Von + j - 1)
Grüße
bastla
[Edit] Nach genauerem Lesen: In Deinem ATX-Datei-Beispiel reichen die Blöcke von der Zeile 1 bis zur Zeile 4 und von Zeile 5 bis Zeile 7 (sollte ja eine Leerzeile sein); daher sollte der dritte Block erst bei Zeile 8 beginnen, in der ALG-Datei steht aber 7 und Zeilenanzahl 2 ... [/Edit]
Es sit ja schon eine Weile her, aber ich suche nach einer ähnlichen Lösung.
Es gibt zwei Dateien, die kombiniert werden sollen. Allerdings sind die Inhalte, die zusammen gehören nicht mit der Zeilennummer (weil kann immer mal an unterschiedlichenStellen stehen) sondern über eine Artikelnummer zu identifizieren.
Also aus:
10010; 23,50; 2344
und:
10010; Teil 1234
soll:
10010; 23,50; 2344; Teil 1234
werden. Kann mir da nochmal jemand auf die Sprünge helfen? Da stimmt ja dann die Variable $row nicht mehr. Und
Danke!
Es gibt zwei Dateien, die kombiniert werden sollen. Allerdings sind die Inhalte, die zusammen gehören nicht mit der Zeilennummer (weil kann immer mal an unterschiedlichenStellen stehen) sondern über eine Artikelnummer zu identifizieren.
Also aus:
10010; 23,50; 2344
und:
10010; Teil 1234
soll:
10010; 23,50; 2344; Teil 1234
werden. Kann mir da nochmal jemand auf die Sprünge helfen? Da stimmt ja dann die Variable $row nicht mehr. Und
Danke!
Zitat von @Micky01855:
Es sit ja schon eine Weile her, aber ich suche nach einer ähnlichen Lösung.
Es gibt zwei Dateien, die kombiniert werden sollen. Allerdings sind die Inhalte, die zusammen gehören nicht mit der
Zeilennummer (weil kann immer mal an unterschiedlichenStellen stehen) sondern über eine Artikelnummer zu identifizieren.
Hallo Micky,Es sit ja schon eine Weile her, aber ich suche nach einer ähnlichen Lösung.
Es gibt zwei Dateien, die kombiniert werden sollen. Allerdings sind die Inhalte, die zusammen gehören nicht mit der
Zeilennummer (weil kann immer mal an unterschiedlichenStellen stehen) sondern über eine Artikelnummer zu identifizieren.
probiers mal hiermit:
$file1 = gc "C:\temp\datei1.txt"
$file2 = gc "C:\temp\datei2.txt" | out-string
$fileMerged = "C:\temp\merged.txt"
$newContent = ""
foreach($row in $file1){
if ($row -match "^\d+;"){
$artnr = $row.Split(";").Trim()
$regex = new-Object regex("^$artnr;([^\r\n]*)", [System.Text.RegularExpressions.RegexOptions]::Multiline)
$match = $regex.Match($file2)
if ($match.Success){
$newContent += $row + ";" + $match.Groups[1].Value + "`r`n"
}else{
$newContent += $row + "`r`n"
}
}else{
$newContent += $row + "`r`n"
}
}
set-content $fileMerged $newContent