myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Textdokument per Batch auswerten (https://mygully.com/showthread.php?t=5277637)

Kaiser11 03.12.18 16:02

Textdokument per Batch auswerten
 
Hallo,
ich hoffe ihr könnt mir beim erstellen einer Batch Datei behilflich sein.
Ich habe in einem Verzeichnis sehr viele Logfiles in denen immer wieder „Datum Errorxx“ Einträge vorhanden sind.
Um diese zu filter habe ich den find Befehl benutzt. Anschließend werden alle Error Zeilen mit dem >> Befehl in ein neues File geschrieben.
Dies sieht dann in etwa folgermaßen aus:
01.01.2018_12:34 Error12
01.01.2018_13:45 Error03
01.01.2018_14:34 Error12
01.01.2018_16:45 Error08

Ich möchte jetzt eine zusätzliche Batch erstellen, welche die jeweiligen Zeilen auswertet
Dies sollte folgermaßen aussehen:
01.01.2018_12:34 Error12
Motor1
01.01.2018_13:45 Error03
Motor2
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Soweit es dies verstanden habe kann ich wieder mit dem find Befehl arbeiten.
Aber dann weiß ich leider nicht mehr weiter.
Ich hoffe ihr könnt mich ein bischen unterstützen bzw. ein paar Ratschläge geben.

Schönen Abend

0x331 05.12.18 10:27

Bevor dir hier keiner antwortet :D
Das gesamts***** sollte so aussehen?:

-->ERRORXXlogs aus verschiedenen Dateien in Verzeichnis in eine neue log Datei schreiben.

01.01.2018_12:34 Error12
01.01.2018_13:45 Error03
01.01.2018_14:34 Error12
01.01.2018_16:45 Error08

-->im nächsten Schritt soll die neue Log Datei ausgewertet werden. Hier wird von jeder Zeile der Error ausgewertet so ist z.B. (Error12 => Motor1). Und das soll dann in eine neue Zeile/ dahinter etc. geschrieben werden.

01.01.2018_12:34 Error12
Motor1
01.01.2018_13:45 Error03
Motor2
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Wo ist die Fehlerübersicht? Wie viele Fehler gibt es? Bzw. du könntest das auch ohne zwischen Log-File auswerten.

Mein Ratschlag: geh weg von Batch und mach das kleine S***** mit python

eitch100 05.12.18 15:01

Zum Ersten solltest du da mal in der "Programmierabteilung" nachfragen...
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Zum Zweiten solltest du mal deinen Code posten, da kann man bestimmt gleich die Auswertung mit einfügen. Wenn es nicht zu viele Möglichkeiten sind bzw. nur 3 ist das mit einer einfachen oder mehrfachen "if (else)-Anweisung" bestimmt möglich. Das geht natürlich auch mit vielen Möglichkeiten; aber naja... das wird irgendwann unübersichtlich.

Zum Dritten würde ich es mit Excel machen. Ich könnte es heute nicht mehr, aber die Auswertung wird später sicher übersichtlicher und kann beliebig erweitert werden... könntest mal in "Herbers Excel Forum" fragen... hier mal ein ungefähres Beispiel:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Osiris1983 05.12.18 17:04

Zitat:

Zitat von eitch100 (Beitrag 33297723)
Zum Ersten solltest du da mal in der "Programmierabteilung" nachfragen...

Definitiv, aber bitte dann bevor ein Thema in dem falschen Bereich erstellt wird. Wenn das Thema schon in dem falschen Bereich erstellt wurde, dann bittet einen zuständigen Mod (also in dem Fall mich) oder falls in dem Bereich kein Mod eingetragen ist, einen blauen Mod, das Thema zu verschieben :T

Thema verschoben

Kaiser11 06.12.18 23:38

Danke für die Antworten.

@0x331
Es gibt ca. 30 Fehler.
Ich habe die Fehlerübersicht aktuell einfach nur in einem Textdokument.
Ich habe im Internet folgenden Code gefunden.

@echo off &setlocal
set "search=%"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%

Dies war mein erster Ansatz welchen ich leider nicht komplett funktionsfähig hingebracht habe.
Bei diesem Code müsste ich dann für jeden Fehler den Code anpassen und in der Batch ergänzen was natürlich extrem
umständlich ist.

@eitch100
Ich hab mir gedacht ein Batch Programm ist für die "Programmierabteilung"
ein bischen unterdimensioniert :D
Ich habe z.B. 40 Logfiles auf meinem PC
In meiner aktuellen Batch Datei führe ich eigentlich nur folgende Zeile aus.

find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt
Dadurch bekomme ich ein .txt File in dem alle Zeilen welche einen Error Eintrag enthalten zusammenfasst.

Mein neuer Ansatz:
Zu beginn der Batch Datei definiere ich die Fehlerliste
set 1.0=Error03
set 1.1=Motor2
set 2.0=Error12
set 2.1=Motor1

x.0 Steht für den Error Code welcher in den Logfiles ist.
x.1 Steht für den Text der anstatt des Error Code angezeigt werden soll


Das Filtern der Error Einträge bleibt gleich:
find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt

Jetzt weis ich aber nicht mehr weiter. Ich brauche eine Schleife welche
nacheinander das Errorergebnis.txt File nach 1.0, 2.0,... durchsucht und
falls z.B. 1.0 gefunden wird eine Zeile mit 1.1 ergänzt.

Zum Schluss würde das Errorergebnis.txt folgendermaßen ausschauen:
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Könntet ihr mir da noch ein paar Tipps geben um dies zu realisieren.

Wie ihr schon geschrieben habt könnte dieser Ablauf natürlich mit anderen
Programmen z.B. Excel oder Phyton einfacher realisiert werden. Mein Problem ist jedoch ich möchte unabhängig auf jeden beliebigen Rechner diese Batch starten können und deshalb würde ich gerne bei Batch bleiben.

Schönen Abend.

Erik/Schreier 07.12.18 05:42

Zitat:

Zitat von Kaiser11 (Beitrag 33307903)
Dies war mein erster Ansatz welchen ich leider nicht komplett funktionsfähig hingebracht habe. Bei diesem Code müsste ich dann für jeden Fehler den Code anpassen und in der Batch ergänzen was natürlich extrem umständlich ist.

Haben sich vermutlich auch andere gedacht und daraufhin Ende der 50er Jahre Funktionale Programmierparadigmen entwickelt.

Zitat:

Zitat von Kaiser11 (Beitrag 33307903)
find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt
Dadurch bekomme ich ein .txt File in dem alle Zeilen welche einen Error Eintrag enthalten zusammenfasst.

Da ich nicht glaube dass sich die Funktion des >> Operators gross von anderen Sprachen unterscheidet sieht es eher so aus als würdest du die Fehlerliste bei jedem Aufruf and die alte Fehlerliste anhängen.

Da du auf diese weise ohnehin jedesmal die Ausgangsliste löschen und neu erstellen musst kannst du die Liste auch gleich in der Shell ausgeben.

Zitat:

Zitat von Kaiser11 (Beitrag 33307903)
Zu beginn der Batch Datei definiere ich die Fehlerliste
set 1.0=Error03
set 1.1=Motor2
set 2.0=Error12
set 2.1=Motor1

x.0 Steht für den Error Code welcher in den Logfiles ist.
x.1 Steht für den Text der anstatt des Error Code angezeigt werden soll

Tu dir selbst nen Gefallen und verwende eine Sprache die Dictionaries unterstützt, das da tut schon beim zusehen weh.

Zitat:

Zitat von Kaiser11 (Beitrag 33307903)
Wie ihr schon geschrieben habt könnte dieser Ablauf natürlich mit anderen
Programmen z.B. Excel oder Phyton einfacher realisiert werden. Mein Problem ist jedoch ich möchte unabhängig auf jeden beliebigen Rechner diese Batch starten können

Und exakt aus diesem Grund solltest du Python verwenden!

Herr Gott. Warum du aus ner Fehlerliste eine Liste mit speziellen Fehlern erstellen willst und aus dieser dann noch eine mit der Übersetzung der Fehler leuchtet mir nicht ein.

Schreib ein Python s***** das die Logdatei Zeile für Zeile einliest, verwende slicing um den Fehlercode zu isolieren, immerhin scheinen die Zeilen immer 23 Zeichen lang zu sein wobei der Fehlercode immer ln[-7] - ln[-1] ist, ersetzt mithilfe eines Dictionaries den Fehlercode direkt durch den Motor der den Fehler geschossen hat und gib die Zeile zum Schluss in der Shell aus, mit nem Alias braucht son s***** nichtmal ne Sekunde zur Ausführung.

Wornat1959 07.12.18 19:32

@Kaiser11:
Das hier ist ja schon eine Art "Replace" wenn ich die Semantik richtig erfasse:
Code:

@echo off &setlocal
set "search=%"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%

Dir fehlt auf der S*****-Ebene nur das er das Ergebnis aus dem find für jeden Key/Value ausführt. Könnte man auch auf der S*****-Ebene lösen. Aber mir ist die Windows-Shell-Syntax zu krude. Auf der Linuxebene mit nem Shellskript gerne. Aber dann brauchste eine "bash" unter Windows.

Weil dir plattformunabhängigkeit wichtig war kannste aber auch Java nehmen. Das nötige JRE kannste für nahezu jede Plattform bekommen.

Und dann vielleicht so:
Code:

import java.io.File;
import java.io.FilenameFilter;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Scanner;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Errorlogger
{
    public static final String LOG_VERZEICHNIS = "C:\Logfiles";
    public static final String LOG_SUFFIX = ".log";
   
    public static final HashMap replaceMap = new HashMap <String, String> ()
                                {{ put("Error03", "Motor2");
                                  put("Error12", "Motor1");
                                  put("Error08", "Motor3");
                                }};
   
    private static File logDirectory;
    private static File[] logFiles;
   
    public static void main(String[] args)
    {
        logDirectory = new File(LOG_VERZEICHNIS);
        logFiles = logDirectory.listFiles(new FilenameFilter()
        {
            @Override
            public boolean accept(File dir, String name)
            {
                return name.toLowerCase().endsWith(LOG_SUFFIX);
            }
        });
       
        Iterator<String> keyIterator;
        String laufSearch;
        String laufReplace;
        String laufLine;
        Scanner scanner;

        for (int lauf=0; lauf<logFiles.length; lauf++)
        {
            keyIterator = replaceMap.keySet().iterator();
            while (keyIterator.hasNext())
            {
                laufSearch = keyIterator.next();
                laufReplace = (String) replaceMap.get(laufSearch);
               
                try
                {
                    scanner = new Scanner(logFiles[lauf]);
                }
                catch (FileNotFoundException ex)
                {
                    ex.printStackTrace();
                }

                while (scanner.hasNextLine())
                {
                    laufLine = scanner.nextLine();
                   
                    Pattern pat = Pattern.compile(laufSearch);
                    Matcher match = pat.matcher( laufLine );
                    if (match.find())
                    {
                        System.out.println(laufLine.replace(laufSearch, laufReplace));
                    }
                }
            }
        }
    }
}

Dann kommt die Ausgabe auf den Bildschirm (stdout). Du kannst das aber dann genauso wie beim find mit dem ">>"-Operator in eine Datei umleiten.
Man könnte das auch per java noch wieder in eine Datei schreiben - hatte ich aber keine Lust mehr drauf ... ;)

Es wird übrigens wirklich ersetzt und nicht eine neue Zeile eingebaut. Weil das war das was das Code-Schnippsel das du oben hattest auch macht wenn ich die Semantik richtig verstanden hatte. Also du bekommst dann so eine Ausgabe:
Code:

run:
01.01.2018_16:45 Motor3
01.01.2018_14:34 Motor1

Achja und du definierst die Zuordnung der Error->Motor Beziehungen oben in der replaceMap. Genauso stellste da das Verzeichnis wo die Logdateien liegen ein und kannst auch noch deren Dateisuffix einstellen. Das liesse sich auch noch weiter in den Aufruf des Programs auslagern als Parameter. Aber das Programm ist nur ein erster Ansatz für eine Java-Lösung und lässt sich sicher weiter verbessern.

Erik/Schreier 10.12.18 22:39

https://abload.de/img/screenshot_20181211-0ezihf.jpg

Jetzt weiss ich wieder warum ich kein Java nutze, in Ruby erklärt sich der Code fast von selbst.

Sorry für die lange Dauer bis zur Antwort, hab im Mom nur wenig Zeit.

https://abload.de/img/screenshot_20181215-1pqiu9.jpg

Hier die PeP konforme Python Version, die erste war durch das über tragen des anderen Codes Mist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.