Cover Image

Konsolen-fu

Dateiliste in Konsole

Januar 11, 2024 - Lesezeit: ~1 Minute

Da wollte ich mal schnell ne Dateiliste ziehen um damit weiterzuarbeiten. Unter Windows kann man folgenden Befehl erfolgreich einsetzen:

C:\> dir /b

Kann man unter Linux auch probieren. Klappt nicht so. Statt dessen nimmt man ls. Aber ls hat so schöne viele verschiedene Parameter. Schnell in die Man-Page nachgeschaut:

/> ls -1b

So, jetzt haben wir die Liste. Elektronisch verarbeitbar wäre sie aber erst, wenn ich das in einer Datei hab. Also shiften wir die Ausgabe einfach in eine Datei um:

C:\> dir /b >> list.txt

oder in Linux

/> ls -1b >> list.txt

Macht einem die Arbeit wirklich leichter.


Cover Image

Finden und gefunden

find unter Linux

Dezember 7, 2023 - Lesezeit: 2 Minuten

Wenn man Dateien sucht, ist das gerade, wenn Dateien vom System erstellt werden, immer etwas mühselig. Das wird sogar noch schlimmer, wenn man die dann löschen will. Unter Linux, wo auch sonst, gibt es einen tollen Befehl, der einem die Arbeit deutlich erleichtert:

find

Mithilfe von find kann man einfach Dateien anhand eines Filter finden und dann sogar direkt löschen. Das kann zum Beispiel so aussehen:

find -name "*.cs" -type f

Hier suche ich alle cs Dateien im aktuellen Ordner. Ich schränke auch auf Dateien ein (-type f)

find -not -name "*.cs" -type f

Hier suche ich nach allen Dateien, die keine cs Dateien sind. So einfach.

find ./ -not -name "*.cs" -type f

Durch den verweis auf einen Pfad geben ich an ob auch Unterordner durchsucht werden sollen. Und das Ganze kann ich jetzt sogar noch kombinieren:

find ./ -name "*.*_*" -not -name "*.cs" -type f

Und wenn ich mir dann habe ausgeben lassen, was die Suche so ergibt, kann ich, entsprechende Rechte vorausgesetzt, das Ganze direkt löschen:

find ./ -name "*.*_*" -not -name "*.cs" -type f -delete

Aber aufpassen, der fragt nicht nochmal nach.

Gibt's das auch für nativ Windows? Bestimmt, aber da würde ich es wahrscheinlich lieber selber schreiben...


Cover Image

Text To Hex

Hex Hex

November 6, 2023 - Lesezeit: 14 Minuten

Manchmal kann es sinnvoll sein, sich Text in Hex anzeigen zu lassen. Besonders bevor man mit ihm weiterarbeitet, da es wirklich vorkommen kann, dass intern mit anderen Werten gearbeitet wird und diese Info dann im weiteren Verlauf fort ist, was zu Problemen führen kann. Dafür hab ich mal ne Funktion geschrieben:

function utf8ToHex(str) {
return Array.from(str).map(c =>
c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) :
encodeURIComponent(c).replace(/\%/g,'').toLowerCase()
).join('-');
}

Mithilfe dieser Funktion kann man einen String leicht analysieren. So geschehen mit folgender Funktion:

utf8ToHex(new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20))

Das Ergebnis war sehr intressant:

32-30-2c-30-30-c2a0-e282ac

An der Stelle, wo ich ein Leerzeichen "20" vermutete war ein "c2a0". Sieht man beim Ausgeben nicht und ist beim Kopieren weg. Folgende Funktion funktionierte dann nicht wie gewünscht:

new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20).match(new RegExp("0 €", 'gi'))

-> null

Ich erwartete, dass das geht. Weil ich ja nur ein Leerzeichen gesehen habe. Da war aber ein NOBREAK.

So geht es jetzt:

new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20).replace('\xa0',' ').match(new RegExp('0 €','gi'))

2 Stunden testen und suchen, nur weil ich es nicht gesehen haben und es beim Kopieren verloren gegangen ist...


Cover Image

PythonDF

PDF hacking in Python

Juni 20, 2022 - Lesezeit: 11 Minuten

Das PDF Format ist ein hervorragendes Format um Dokumente nicht nur per Email zu transportieren, sondern auch zum Drucken oder Archivieren. Die Unterstützung dieses Formats ist inzwischen so ziemlich überall verfügbar. Daher ist es naheliegend, dass auch Symolo dieses Format vollständig unterstützt. Intern wird zum Beispiel jeder einzelne Druckauftrag zuerst als PDF abgebildet und dann an den Drucker weitergereicht. Das bedeutet, dass immer die Möglichkeit zur Verfügung steht, dass gegebenenfalls das Dokument auch nur gespeichert wird oder zusätzlich als Archiveintrag hinterlegt werden kann. Zudem ist das zu erwartende Druckbild immer schon vorher ersichtlich. C# bietet hier schon seit langem Bibliotheken, die aus Java übernommen wurden. Jetzt ist es immer recht aufwendig in C# einfache Aufgaben mit PDFs zu erledigen, da dann immer erstmal ein komplettes Projekt aufgemacht werden muss und wir die ganzen großartigen Typenprüfungen haben. Mit Python kann man meistens schneller ein Prototyp entwickeln und die Logik grundsätzlich mal prüfen, bevor das Ganze dann sauber als C# in den Symoloserver wandert. Alternativ kann man natürlich auch das Python in de Server verfrachten und nutzen. Dazu ist gar nicht so viel notwendig.

Wie immer geht es mit entsprechenden Bibliotheken los:

import pdfplumber
from PyPDF2 import PdfFileWriter, PdfFileReader  # pip install PyPDF2

Plumber wird hierbei für die Analyse verwendet und PyPDF2 für die Verwaltung der Datei.

Fangen wir mal mit der Verwaltung an. Möchte man z.B. die Dateien in einzelne Seiten splitten ist das jetzt ganz einfach:

infile = "<myFile>.pdf"

input_pdf = PdfFileReader(open(infile, "rb"))

counter = 0

for p in input_pdf.pages:
    outfile = "data/Output_" + str(counter) + ".pdf"
    output_file = open(outfile, "wb")
    output = PdfFileWriter()
    output.addPage(p)
    counter += 1
    output.write(output_file)

Die Analyse des Inhaltes kann, mithilfe von pdfplumber, genauso einfach erfolgen:

FileToUse = "<myFileToUse>.pdf"  # sys.argv[1]

pdfText = ""

with pdfplumber.open(FileToUse) as pdf:

    for page in pdf.pages:
        pdfText += page.extract_text()

print(pdfText)

Und schon kann man die Text zum Beispiel mithilfe von Regex einfach analysieren und Informationen aus den Dateien gewinnen.

Hier sollte vielleicht noch erwähnt werden, dass das Verfahren so nicht auf Bilder in PDFs anwendbar ist. Entweder ist die PDF Datei einen elektronisch erstellte Datei oder es wurde nachträglich entsprechende OCR Daten angefügt. Für einen schnellen Test ist dieses Verfahren aber mehr als ausreichend. Wenn eine OCR Analyse benötigt wird, bringt der Symoloserver dafür bereits passende Funktionen mit. Da der Server ja unkompliziert via Python angesprochen werden kann, ist auch dann immer noch ein schnelles Prototypen unkompliziert realisierbar.