Zu viele und fehlende PDFs identifizieren Laufzeit optimieren

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Zu viele und fehlende PDFs identifizieren Laufzeit optimieren

    Hallo,

    ich habe eine csv Datei in der Datensätze und deren Felder sind mit ";" getrennt. In einem dieser Felder steht immer ein PDF Name.

    Nun muss ich 2 Dinge ermitteln.
    1. Gibt es alle im CSV stehenden PDF Dateien auch im Verzeichnis
    2. Stehen im Verzeichnis PDF Dateien zu denen es keinen Eintrag in der csv Datei gibt.

    Eine Lösung habe ich dafür bereits programmiert. Leider ist meine Lösung sehr Laufzeit intensiv. Sie benötigt bei mir mit ca. 1400 csv Zeilen um die 13 Sekunden. Und das ist mir viel zu lange. Der Zeitfresser entsteht im zweiten Teil wo ich schaue welche PDF Datei zu viel vorhanden sind, der alleine braucht 10 Sek.
    Hat jemand eine Idee wie es besser programmiert werden kann? Vielleicht besser mit 2 List(of T), aber da kriege ich irgendwie keine funktionierende Idee hin.

    Quellcode

    1. Dim zeile As String
    2. Dim inhalte() As String
    3. Dim KompletteDatei As String
    4. Dim AlleZeilen() As String
    5. KompletteDatei = sr.ReadToEnd
    6. AlleZeilen = KompletteDatei.Split(";")
    7. zeile = AlleZeilen(0).ToString
    8. For Each zeile In AlleZeilen
    9. inhalte = zeile.Split(feldtrennzeichen)
    10. If My.Settings.Mandanten.IndexOf(inhalte(0)) = -1 Then
    11. ... hier kommt nur ne simple Abfrage
    12. end if
    13. Dim FileInfoX As New IO.FileInfo(dmsImportO.OrdnerPfad & "\" & inhalte(8))
    14. If Not FileInfoX.Exists Then
    15. If FehlendePDFs > "" Then
    16. FehlendePDFs = FehlendePDFs & ";" & inhalte(8)
    17. Else
    18. FehlendePDFs = inhalte(8)
    19. End If
    20. end if
    21. Next
    22. REM schauen welche PDF Dateien zuviel sind:
    23. Dim PDFsOhneSatz As String = ""
    24. Dim pdf As System.IO.FileInfo
    25. For Each Pfad As String In Directory.GetFiles(dmsImportO.OrdnerPfad, "*.pdf")
    26. pdf = My.Computer.FileSystem.GetFileInfo(Pfad)
    27. If KompletteDatei.IndexOf(pdf.Name.ToString) = -1 Then
    28. If PDFsOhneSatz > "" Then
    29. PDFsOhneSatz = PDFsOhneSatz & ";" & pdf.Name.ToString
    30. Else
    31. PDFsOhneSatz = pdf.Name.ToString
    32. End If
    33. End If
    34. Next


    Verschoben. ~Trade

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Willkommen im Forum.
    Statt den Quellcode-Button besser den VB.Net-Button nutzen, damit Syntax-Highlighting aktiviert wird, siehe unten, bei meinem noch folgenden Code.
    Bitte vergiss Option Strict On nicht, denn die Split-Funktion in Zeile#7 akzeptiert keine Strings, sondern Chars. Hier einfach zu lösen mit:

    VB.NET-Quellcode

    1. AlleZeilen = KompletteDatei.Split(";"c)

    sr.ReadToEnd => StreamReader? Vielleicht ist IO.File.ReadAllLines etwas näher am Ziel, weil es Dir gleich ein String-Array mit allen Zeilen der Datei zurückgibt, die Du dann auseinanderpfriemeln kannst.
    Und für den 2. Codeteil (Zeile#30) noch ein IO.File.ReadAllText. Dann kannst Du per .Contains(PdfFileName) schneller Dein Ziel erreichen.
    Die Zeilen 17-21 kannst Du einfacher gestalten:

    VB.NET-Quellcode

    1. Dim ListOfMissingPdfFileNames As New List(Of String)
    2. For Each zeile In AlleZeilen
    3. inhalte = zeile.Split(feldtrennzeichen)
    4. Dim FileInfoX As New IO.FileInfo(dmsImportO.OrdnerPfad & "\" & inhalte(8))
    5. If FileInfoX.Exists Then Continue For 'Ich bevorzuge einen schnellen Abbruch des Schleifendurchgangs, aber das ist Geschmackssache.
    6. ListOfMissingPdfFileNames.Add(inhalte(8))
    7. Next
    8. Dim AllMissingFiles = String.Join(";", ListOfMissingPdfFileNames.ToArray)
    9. For Each PdfFile In Directory.GetFiles("dmsImportO.OrdnerPfad", "*.pdf")
    10. If KompletteDatei.Contains(PdfFile) Then Continue For
    11. 'hier dann das gleiche Zusammenbauen der ensprechenden Dateinamen wie oben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.