Top-Themen

Aktuelle Themen (A bis Z)

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
GELÖST

Zwei Dateien per Batch zusammenfügen

Frage Entwicklung Batch & Shell

Mitglied: Eisbrecherin

Eisbrecherin (Level 1) - Jetzt verbinden

06.03.2014, aktualisiert 14:08 Uhr, 1463 Aufrufe, 8 Kommentare, 1 Danke

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:
01.
[Wed Feb 19 20:22:42 2014] 
02.
Create Spreadsheet Update Log 
03.
[Thu Feb 20 09:44:11 2014] 
04.
Log Updates From User [ User1 ] Starting At Row [ 1 ] For A Total Of [ 4 ] Rows 
05.
[Thu Feb 20 09:46:14 2014] 
06.
Log Updates From User [ User1 ] Starting At Row [ 5 ] For A Total Of [ 2 ] Rows 
07.
[Thu Feb 20 09:46:14 2014] 
08.
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.
01.
"M1" "M2" "M3" 
02.
"P1" "P7" "Produkt" 
03.
"Kto1" "Konto" "Kto2" 
04.
 
05.
"GJ" "M" "M12" 
06.
"Kto1" "Kto3" "Kto4" "Kto5"
Ich möchte nun eine Ausgabe, die in etwa so aussehen soll:
01.
[Wed Feb 19 20:22:42 2014] 
02.
Create Spreadsheet Update Log 
03.
[Thu Feb 20 09:44:11 2014] 
04.
Log Updates From User [ User1 ] Starting At Row [ 1 ] For A Total Of [ 4 ] Rows 
05.
"M1" "M2" "M3" 
06.
"P1" "P7" "Produkt" 
07.
"Kto1" "Konto" "Kto2" 
08.
 
09.
[Thu Feb 20 09:46:14 2014] 
10.
Log Updates From User [ User1 ] Starting At Row [ 5 ] For A Total Of [ 2 ] Rows 
11.
"GJ" "M" "M12" 
12.
"Kto1" "Kto3" "Kto4" "Kto5" 
13.
 
14.
[Thu Feb 20 09:46:14 2014] 
15.
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
Mitglied: bastla
LÖSUNG 06.03.2014, aktualisiert um 14:08 Uhr
Hallo Eisbrecherin!

Soferne VBS für Dich ok wäre, etwa so:
01.
ALG = "Datei1.alg" 
02.
ATX = "Datei1.atx" 
03.
LG = "Datei1.log" 
04.
Header = 2 'Anzahl Koopfzeilen 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
 
08.
set rE = New RegExp 
09.
rE.Pattern = ".*\[ .+ \].+\[ (\d+) \].+\[ (\d+) \]" 
10.
rE.Global = True 
11.
 
12.
ALGZ = Split(fso.OpenTextFile(ALG).ReadAll, vbNewline) 
13.
ATXZ = Split(fso.OpenTextFile(ATX).ReadAll, vbNewLine) 
14.
 
15.
For i = 0 To UBound(ALGZ) 
16.
    LOGZ = LOGZ & vbNewline & ALGZ(i) 
17.
    If i >= Header And Left(ALGZ(i), 1) <> "[" Then 
18.
        Set Matches = rE.Execute(ALGZ(i)) 
19.
        If Matches(0).SubMatches.Count = 2 Then 
20.
            Von = Matches(0).SubMatches(0) 
21.
            Anzahl = Matches(0).SubMatches(1) 
22.
            WScript.Echo Von, Anzahl 
23.
            For j = 0 To Anzahl - 1 
24.
                LOGZ = LOGZ & vbNewline & ATXZ(Von + j) 
25.
            Next 
26.
        Else 
27.
            WScript.Echo "Fehler in Zeile " & i  + 1 & " !" 
28.
            WScript.Quit 1 
29.
        End If 
30.
    End If 
31.
Next 
32.
 
33.
fso.CreateTextFile(LG).Write Mid(LogZ, 3)
Grüße
bastla
Bitte warten ..
Mitglied: colinardo
LÖSUNG 06.03.2014, aktualisiert um 14:08 Uhr
Hallo Ines,
und wenn's Powershell sein darf:
01.
$file1 = gc "C:\datei1.alg" 
02.
$file2 = gc "C:\datei2.atx" 
03.
$fileMerged = "C:\merged.txt" 
04.
 
05.
$newContent = "" 
06.
foreach($row in $file1){ 
07.
    if ($row -match "^Log Updates From"){ 
08.
        $regex = [regex] "\[ (\d+) \]" 
09.
        $matches = $regex.Matches($row) 
10.
        [int]$start =  $matches[0].Groups[1].Value 
11.
        [int]$len = $matches[1].Groups[1].Value 
12.
        $newContent += $row + "`r`n" 
13.
        for ($i = $start-1;$i -lt ($start-1+$len);$i++){ 
14.
            $newContent += $file2[$i] + "`r`n" 
15.
16.
        $newContent += "`r`n" 
17.
    }else{ 
18.
        $newContent += $row + "`r`n" 
19.
20.
21.
$newContent | out-File $fileMerged
Grüße Uwe
Bitte warten ..
Mitglied: Eisbrecherin
06.03.2014 um 13:45 Uhr
Hi bastla,

VBS ist absolut ok
Vielen Dank für die schnelle Hilfe!

Ich habe Zeile 15 noch geändert auf
01.
For i = 0 to UBound(ALGZ)-1
Ohne -1 kam immer ein Laufzeitfehler, wenn er den letzten Eintrag erreicht hatte.

Ein kleines Problem habe ich aber noch: Die erste Zeile kommt nicht richtig mit.

Die Log-Datei sieht so aus:
01.
[Wed Feb 19 20:22:42 2014] 
02.
Create Spreadsheet Update Log 
03.
[Thu Feb 20 09:44:11 2014] 
04.
Log Updates From User [ User1 ] Starting At Row [ 1 ] For A Total Of [ 4 ] Rows 
05.
"P1" "P7" "Produkt"  
06.
"Kto1" "Konto" "Kto2"  
07.
 
08.
"GJ" "M" "M12"  
09.
[Thu Feb 20 09:46:14 2014]  
10.
Log Updates From User [ User1 ] Starting At Row [ 5 ] For A Total Of [ 2 ] Rows  
11.
"Kto1" "Kto3" "Kto4" "Kto5"  
12.
 
Die erste Zeile "M1" "M2" "M3" fehlt komplett und danach werden alle ersten Zeilen immer zu weit hochgesetzt. Ich habe schon ein bisschen mit den Schleifen rumprobiert und konnte mit einer Änderung in Zeile 23 immerhin die erste Zeile wieder einblenden:
01.
For j = -1 To Anzahl - 1
Allerdings bleibt das Problem mit den nachfolgenden Zeilen. Hast du dafür noch eine Lösung?


Viele Grüße
Ines
Bitte warten ..
Mitglied: Eisbrecherin
06.03.2014 um 14:08 Uhr
Hallo Uwe,

ich hatte noch nie das Vergnügen mit PowerShell. Aber was soll ich sagen? Funktioniert einwandfrei
Danke für die Hilfe!


Viele Grüße
Ines
Bitte warten ..
Mitglied: bastla
LÖSUNG 06.03.2014, aktualisiert um 14:30 Uhr
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
If Trim(ALGZ(i)) <> "" Then
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
LOGZ = LOGZ & vbNewline & ATXZ(Von + j - 1)
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]
Bitte warten ..
Mitglied: Eisbrecherin
06.03.2014 um 14:30 Uhr
Hi bastla,

da habe ich beim Beispiel doch glatt bei Datei 1 eine Zeile beim Kopieren übersehen. Schande über mich...!

Aber die Zeile
01.
LOGZ = LOGZ & vbNewLine & ATXZ(Von + j - 1)
war's dann. Mit der funktioniert es genauso wie es soll.

Danke nochmal


Viele Grüße
Ines
Bitte warten ..
Mitglied: Micky01855
04.06.2014 um 10:48 Uhr
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!
Bitte warten ..
Mitglied: colinardo
04.06.2014, aktualisiert um 11:29 Uhr
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,
probiers mal hiermit:
01.
$file1 = gc "C:\temp\datei1.txt" 
02.
$file2 = gc "C:\temp\datei2.txt" | out-string 
03.
$fileMerged = "C:\temp\merged.txt" 
04.
$newContent = "" 
05.
 
06.
foreach($row in $file1){ 
07.
    if ($row -match "^\d+;"){ 
08.
        $artnr = $row.Split(";")[0].Trim() 
09.
        $regex = new-Object regex("^$artnr;([^\r\n]*)", [System.Text.RegularExpressions.RegexOptions]::Multiline) 
10.
        $match = $regex.Match($file2) 
11.
        if ($match.Success){ 
12.
            $newContent += $row + ";" + $match.Groups[1].Value + "`r`n" 
13.
        }else{ 
14.
            $newContent += $row + "`r`n" 
15.
16.
    }else{ 
17.
        $newContent += $row + "`r`n" 
18.
19.
20.
set-content $fileMerged $newContent
Grüße Uwe
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Mit Batch zwei Textfiles in einem zusammenfügen
gelöst Frage von BustedDiceBatch & Shell9 Kommentare

Hallo zusammen brauch eure Hilfe bei einem Batch. Habe zwei .txt Dateien die ich in eine .txt zusammen fügen ...

Batch & Shell
Suche Batch-Programm zum Zusammenfügen zweier PDF-Dateien
gelöst Frage von SinzalBatch & Shell3 Kommentare

Hallo Admins, ich habe ein Programm geschrieben, welches zwei Listen als separate PDF-Dateien ausgibt. Beide Listen sollen jedoch in ...

Batch & Shell
Powershell zwei Schnippsel zusammenfügen
gelöst Frage von JoshuaTreeBatch & Shell10 Kommentare

Get-XAApplication -FolderPath "applications\test" Das ist der gesamte Aufruf Get-XAApplication -FolderPath "applications\test" ist der erste Teil und gibt alle Anwendungen ...

Entwicklung
Zwei .txt Dateien via PowerShell zusammenfügen
gelöst Frage von Alex1809Entwicklung2 Kommentare

Ahoi, ich habe ein kleines Problem bei der Skript Erstellung, mit PowerShell. Und zwar habe ich zwei txt Dateien, ...

Neue Wissensbeiträge
Datenschutz

Weitere Inforamtionen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 2 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 4 StundenWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Microsoft Office

Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei

Anleitung von SarekHL vor 7 StundenMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Erkennung und -Abwehr

Sicherheitslücke Spectre und Meltdown: Status prüfen

Anleitung von Frank vor 13 StundenErkennung und -Abwehr2 Kommentare

Nach all den Updates der letzten Woche sollte man unbedingt auch den Status prüfen, ob die Sicherheitslücken Spectre, Meltdown ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...

Drucker und Scanner
Gesucht DIN A3 Drucker
Frage von NebellichtDrucker und Scanner15 Kommentare

Hallo, ich möchte einen neuen DIN A3 Drucker kaufen. Um ab und zu, ca. 1 mal die Woche Farbausdrucke ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
Frage von Winfried-HHBatch & Shell15 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...