kostenloser Webspace werbefrei: lima-city


Text files verarbeiten - parsen, analysieren, durchsuchen

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    paulfinned

    paulfinned hat kostenlosen Webspace.

    Hi,

    Seit Anfang des Jahres ist es mir immer wieder untergekommen, das ich text-files in irgend einer Art durchsuchen/analysieren mußte.
    Nur irgendwie habe ich keine Methode gefunden das effizient zu gestalten.
    Ich hab auch schon darüber nachgedacht eine richtige Anwendung zu schreiben (hald immer wieder für die jeweilige Aufgabe) das halte ich aber für ineffizient, immer wieder IntelliJ starten oder so
    Daher wollt ich euch mal um Rat fragen was für Möglichkeiten es den da gibt.

    Die Randbedingungen sind (will ich haben, vl geht nicht alles):
    - es muss auch auf Windows laufen.
    - einfach ohne compilieren oder so (vermutlich was interpretierbares)
    - keine zu fette Installation/Abhängigkeiten
    - Unterstützung für eine art "mächtiges"/praktisches debuggen (am besten in intelliJ oder VS Code(das wollt ich mir schon immer mal ansehen)
    - Ich habe Erfahrung in Java, C# und vor Ewigkeiten auch mal bisher php, batch

    Hier habe ich einen sample code wie ich mir "vorstelle" u.a. auch aus Erfahrung bei anderen Problemen wie es aussehen kann.
    Mit einer solchen "art" code könnte es sehr einfach gehen.
    List<File> SrcA= GetFilesFromDirectory(PfadAngabe, "*.imp");	// Hollt sich eine liste aller files mit ".imp"-endung
    List<File> SrcB = GetFilesFromDirectory(PfadAngabe, "!*.imp");	// Hollt sich eine liste aller files ohne ".imp"-endung 
    
    
    // für enthalten
    SrcA.ForEach()								// für alle Files in List A
       .ForEachLineOfFile( lineA -> lineA.GetRegExpMatch('<regExp>'))   	// für alle Zeilen hole den RegExp-Match (obs da was einfacheres aber ähnlich mächtiges gäbe?))
       .ForEach( matchA -> 							// für alle Matches mache ...
                  SrcB.ForEach()						// für alle Files in List B
                      .ForEachLineOfFile( matchA, fileB, lineB -> 			// für alle Zeilen 
                                              if(lineB.Contains(matchA))		// wenn MatchA enthalten ist
    						{String.Format("The String %s is contained in %s: %s", matchA, fileB, lineB)} // gib die Info aus
                                        )
               );
                            
                            
    // für nicht enthalten
    SrcA.ForEach()									// für alle Files in List A
       .ForEachLineOfFile( lineA -> lineA.GetRegExpMatch('<regExp>'))		// für alle Zeilen hole den RegExp-Match 
       .ForEach( fromA -> {								// für alle Matches mache ...
                   if (!SrcB.Any(currentB -> currentB.Contains(fromA))) 		// wenn er nirgends in einem File von Liste B ist 
                      String.Format("The String %s is NOT contained in the List", fromA)	// gib die Info aus
                   });


    Dieser Sample code mag vl schnell von Profis vereinfacht werden, aber ich denke die art des codes ist leicht lesbar und v.a. mächtig & erweiterbar.

    Beitrag zuletzt geändert: 14.2.2017 0:55:22 von paulfinned
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hört sich an als bräuchteste du folgende Dinge:

    - bash
    - sed
    - grep
    - wc
    - find

    Das alles bekommst du auf Windows mit http://www.msys2.org/ oder dem neuen Linux Subsystem in Windows 10.

    Ein paar Beispiele:

    Alle Dateien mit "imp"-Endungen in der Datei "impdateien" speichern:
    find .  -name *.imp > impdateien


    Alle Dateien ohne imp"-Endungen in der Datei "nonimpdateien" speichern:
    find . | grep -v "imp$" > impdateien


    Alle Zeilennummern aus "datei" die "abc" enthalten in "abczeilen" speichern:
    grep -n abc datei | sed -e 's/:.*//' > abczeilen

    "abc" ist ein regex, in dem Fall halt recht einfach. ;)

    Anzahl der Zeilen in "datei" ohne "abc":
    grep -v abc datei | wc -l


    Beitrag zuletzt geändert: 14.2.2017 10:22:04 von tchab
  4. Klingt so, als ob du einfach nur Wissen willst, ob ein bestimmter Text in einer deiner Dateien vorkommt oder nicht.

    Solche Aufgaben kann fast jeder gute Text-Editor schon von Haus aus.

    Zum Beispiel Notepad++ oder PSPad, die beide als "portable" Version ohne Installation heruntergeladen und gestartet werden.
  5. Autor dieses Themas

    paulfinned

    paulfinned hat kostenlosen Webspace.

    hi, scheinbar habe ich die erste Antwort nicht mitbekommen ....
    @tangoal: Wenn das für dich so klingt, hast du mich mißverstanden. (Skriptbar, und schon die Beispiele sind sehr viel mehr als einfache suchen)

    @tchab:
    Hi, danke für die Antwort + sogar gleich Beispiele!
    Allerdings suche ich etwas was eine höhere Abstraktion hat - eben wie der von mir geschriebene Beispiele code (den man z.t. mit einigem Aufwand in C#/Java auch implementieren kann)
    Die höhere Abstraktion ermöglicht es dann leichter/schneller einzusteigen und auch zu warten.
    Hab jetzt letztes mal wieder java (streams, etc) verwendet ...
  6. Mit NodeJS:

    const path = require('path');
    const readline = require('readline');
    const fs = require('fs');
    
    // config
    const needle = 'my string';
    const targetDirectory = path.resolve(__dirname, './myfiles');
    
    // read the target directory
    const filesToScan = fs.readdirSync(targetDirectory);
    
    if (!Array.isArray(filesToScan)) {
        console.error('Cant open directory', filesToScan);
        process.exit(1);
    }
    
    // go for each file and process it
    filesToScan.forEach(file => {
        // start of the processing
        Promise.resolve()
            // first filter the file, if we don't want to work with it
            .then(() => new Promise((resolve, reject) => {
                fs.stat(file, (err, stat) => {
                    // files we can't stat, or are directories, should not be examined
                    err || stat.isDirectory() ? reject(err || 'Not matching') : resolve();
                })
            }))
            // and each file that is ok gets processed
            .then(() => {
                let lineNumber = 0;
                const reader = readline.createInterface({
                    input: fs.createReadStream(file)
                });
    
                // we process the file line by line
                reader.on('line', line => {
                    lineNumber++;
                    // by checking, whether the needle is in the line
                    if (line.toString().indexOf(needle) > -1) {
                        // and log findings
                        console.log('found needle', file, lineNumber);
                    }
                });
            })
            .catch(err => console.log('Wont process file', file, err);
    });


    Ich habs nicht getestet, sollte aber funktionieren. Ist allerdings nur Mockup, und müsste nochmal refactored werden.
    Wäre auch nur EIN Beispiel, ohne Abhängigkeiten. Es gibt noch hunderte weitere Möglichkeiten, die viel sauberer sind (das ist wirklich nur schneller Hackcode, ~2min Entwicklungszeit, wenns hochkommt). Arbeitet die Dateien natürlich Async durch, non-blocking, alle Dateien gleichzeitig (das könnte potenziell problematisch sein, denk dran)

    JavaScript ist First-Class-Citizen in VS Code, und NodeJS lässt sich sehr gut debuggen mit VS Code.

    Aber wirklich: Wenn du es wartbar und längerfirstig nutzen willst, sollte es refactored werden. Der Schnipsel soll nur zeigen, wie mans machen kann.

    Liebe Grüße

    Beitrag zuletzt geändert: 25.4.2017 13:21:58 von ggamee
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!