Text files verarbeiten - parsen, analysieren, durchsuchen
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
art
beispiel
code
datei
endung
erfahrung
file
format
list
liste
log
mache
match
not
speichern
string
text
url
windows
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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. -
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 ... -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage