Laden...

.txt Datei Filtern und die wichtigen daten extrahieren

Erstellt von LangWind vor einem Jahr Letzter Beitrag vor einem Jahr 614 Views
L
LangWind Themenstarter:in
6 Beiträge seit 2022
vor einem Jahr
.txt Datei Filtern und die wichtigen daten extrahieren

Hallo,
ich hoffe ich bin hier richtig .

Ich bin gerade dabei in C# ein tool zu Programmieren was mir auf der Arbeit etwas zeit Erspart.
Und zwar bekommen wir von unserem Arbeitgeber eine .pdf Datei mit dem Arbeitsaufträgen wo wir dann noch per Hand die daten in Trello einpflegen müssen, was ich aber gerne automatisieren möchte.

meine Frage ist :
-Wie kann ich die fettgedruckten werte extrahieren , und ich c# als String Variablen Speichern ?

Das ist nur eine Skizze !
Die Schriftart ist im original konstant und einige Bereiche könnten mehrzeilig sein !

MFG

Auftrag von 02.04.2022 für Herrn Max Mustermann

Arbeit: Reparatur an der Dachrinne

Material: PVC

Arbeiter: Olaf:o Günter:x Peter:o

Auftrag zum Termnin:

Fr. 21.04.2022 16:00 ** Erste Abnahme**

4.931 Beiträge seit 2008
vor einem Jahr

Hallo und willkommen,

zuersteinmal mußt du die Texte aus dem PDF extrahieren. Dazu benötigst du eine passende Bibliothek wie z.B. iText 7 (Nachfolger von iTextSharp): Extracting text from pdf using iText7 c# library.

Dann liest du die Textdaten entweder jeweils zeilenweise und überprüfst anhand des Textanfangs (String.StartsWith) und extrahierst dann die passenden Werte (z.B. per IndexOf + String.Substring)), s.a. Methoden der Klasse String.
Wenn die Reihenfolge der Daten immer gleich ist, dann kannst du auch einfach sequentiell vorgehen.

Eine andere Alternative wäre die Benutzung von Regex, s.a. [Artikel] Regex-Tutorial.

C
55 Beiträge seit 2020
vor einem Jahr

Guten Morgen

Mein erster Ansatz wäre jetzt Regular Expressions(Regex). Damit kann man schon eine Menge anstellen, was das verarbeiten von Texten/Zeichenketten angeht, damit solltest du auch die Daten aus deiner Datei bekommen.

Grüße

6.911 Beiträge seit 2009
vor einem Jahr

Hallo LangWind,

achte bei iText unbedingt auf die Lizenz.

Falls das PDF rein textuell aufgebaut ist, so kann auch z.B. mittels pdfgrep der Text extrahiert und anschließend von deinem C#-Programm geparst werden.
Da der Export rein textuell ist und gem. deinem Beispiel das recht kanonisch aufgebaut ist, sollte das gehen. Bei den Arbeitern ist der Fettgedruckte auch mit einem x versehen, so dass dies (beim Beispiel zumindest) eindeutig ist.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
LangWind Themenstarter:in
6 Beiträge seit 2022
vor einem Jahr

Vielen Dank ich bin weiter gekommen 👍
und habe das Problem Lösen können !

6.911 Beiträge seit 2009
vor einem Jahr

Hallo LangWind,

super, wenn du eine Lösung gefunden hast. Noch idealer und im Sinne der Community wäre jedoch, wenn du hier die Lösung auch zeigen könntest.
Falls jemand ein ähnliches Problem hat, so kann er sich daran orientieren.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
LangWind Themenstarter:in
6 Beiträge seit 2022
vor einem Jahr

Ist jetzt nicht passend zu der Beispiel Txt Datei wie oben, aber so funktioniert das bei mir Fehler frei 😁

Bei Verbesserungen und Komprimierungs vorschlägen der Methode würde ich mich natürlich sehr freuen


 public void WerteSuchen(string Nameof)
        {
            try
            {
                string[] separator = { "\\r\\n" };
                string path = "log.txt";
                string text = File.ReadAllText(path).ToLower();
                File.Delete(path);

                //Art der Arbeit Auslesen
                string SuchStart1 = "art der arbeit:";
                string SuchEnd = "ok rechts";
                string temp1 = text.Substring(text.IndexOf(SuchStart1));
                string Beschreibung = temp1.Substring(0, temp1.IndexOf(SuchEnd));

                //Standort Suchen
                string SuchStart = "standort:";
                string temp = text.Substring(text.IndexOf(SuchStart));
                string temp2 = temp.Substring(9, 39);
                string[] Augselesen = temp2.ToLower().Split(separator, StringSplitOptions.None);
                string herdecke = "herdecke: x";
                string herdecke2 = "herdecke: ox";
                Regex regexherdecke = new Regex(herdecke);
                Regex regexherdecke2 = new Regex(herdecke2);
                string kirchhörde = "kirchhörde: x";
                string kirchhörde2 = "kirchhörde: ox";
                Regex regexkirchhörde = new Regex(kirchhörde);
                Regex regexkirchhörde2 = new Regex(kirchhörde2);
                string wetter = "wetter: x";
                string wetter2 = "wetter: ox";
                Regex regexwetter = new Regex(wetter);
                Regex regexwetter2 = new Regex(wetter2);

                //Datum + Uhrzeit 
                string SuchStart2 = "auftrag zum nächsten termin:";
                string tempTime = text.Substring(text.IndexOf(SuchStart2));
                string timeIn = tempTime.Substring(33, 16);
                DateTime aDate = DateTime.Parse(timeIn);
                string tempTime2 = (aDate.ToString("yyy-MM-ddTHH:mm:sszzz"));

                //Liste Auslesen 
                foreach (string s in Augselesen)
                {
                    if (regexherdecke.IsMatch(s)|regexherdecke2.IsMatch(s))
                    {
                        ApiRequest apiRequest = new ApiRequest();
                        apiRequest.PostRequest(Nameof, "green", Beschreibung, tempTime2);
                        break;
                    }
                    if (regexkirchhörde.IsMatch(s)|regexkirchhörde2.IsMatch(s))
                    {
                        ApiRequest apiRequest1 = new ApiRequest();
                        apiRequest1.PostRequest(Nameof, "blue", Beschreibung, tempTime2);
                        break;
                    }
                    if (regexwetter.IsMatch(s)|regexwetter2.IsMatch(s))
                    {
                        ApiRequest apiRequest2 = new ApiRequest();
                        apiRequest2.PostRequest(Nameof, "pink", Beschreibung, tempTime2);
                        break;
                    }
                    else
                    {
                        ApiRequest apiRequest3 = new ApiRequest();
                        apiRequest3.PostRequest(Nameof, "red", Beschreibung, tempTime2);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 
        }

4.931 Beiträge seit 2008
vor einem Jahr

Die Datei solltest du aber besser erst löschen, nachdem die Methode erfolgreich durchlaufen wurde (also wenn keine Exception aufgetreten ist). Oder ist sie nicht so wichtig und kann wiedererzeugt werden?

Und am besten dann zwei Methoden daraus machen.

D
261 Beiträge seit 2015
vor einem Jahr

Falls deine ganzen regulären Ausdrücke tatsächlich nur aus Literalen bestehen und kein regulären Ausdrücke enthalten, brauchst du die Regex Klasse auch nicht.

Statt



string wetter = "wetter: x";
string wetter2 = "wetter: ox";
Regex regexwetter = new Regex(wetter);
Regex regexwetter2 = new Regex(wetter2);
if (regexwetter.IsMatch(s)|regexwetter2.IsMatch(s))
{
    ApiRequest apiRequest2 = new ApiRequest();
    apiRequest2.PostRequest(Nameof, "pink", Beschreibung, tempTime2);
    break;
}

kannst du auch


string wetter = "wetter: x";
string wetter2 = "wetter: ox";
if (s.IndexOf(wetter) >= 0 || s.IndexOf(wetter2) >= 0)
{
    ApiRequest apiRequest2 = new ApiRequest();
    apiRequest2.PostRequest(Nameof, "pink", Beschreibung, tempTime2);
    break;
}

schreiben.

Hinweis: Es gibt außerdem einen Unterschied zwischen dem
|| Operator: https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/boolean-logical-operators#conditional-logical-or-operator-
und dem
| Operator: https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/boolean-logical-operators#logical-or-operator-

190 Beiträge seit 2012
vor einem Jahr

Hallo, für mich ist etwas verwirrend, dass in der Überschrift von txt die Rede ist, im ersten Beitrag aber plötzlich von pdf und nun wieder von txt. In der Auswertung spielt es dann zwar keine Rolle mehr, aber passt halt irgendwie nicht zusammen.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF