TXT Datei auslesen und enthaltene Pfadangaben Dateien umkopieren

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von samson.

    TXT Datei auslesen und enthaltene Pfadangaben Dateien umkopieren

    Moin Moin Zusammen,

    ich bin auf der Suche nach einer Lösung für ein einfaches auslesen einer ca 700mb großen Datei,
    alle Pfadangaben darin zu suchen und die unter diesem Pfad angegebenen Dateien auf einen anderen Verzeichnisbaum (1:1) zu verschieben oder kopieren.
    Hierbei handelt es sich um die rot geschriebene Zeile.

    Wäre schön, wenn mir da jemand bei helfen würde.

    Grüße Stefan


    Anbei ein Auszug der Beispieldatei:

    01380000020
    014810000084
    0189100679999900
    017910331032015
    0129105001
    01091062
    01380000022
    014810000107
    014921001/99
    014921302/94
    01096001
    02596010101198031032015
    017960212295600
    0138000besa
    014810000467
    0180201679999900
    0410203Systemhaus
    0180212999999901
    0270211TM-Partner
    0170970TM#12345
    0130971TM#1
    0200972TM#01012014
    0460973TM#290#KKH#01102014#01102014#00000000
    0570973TM#205#AOK_BY_HZV_S12#01102014#01102014#00000000
    0180212999999902
    0360211Dr. med. Manfred Mustermann
    0130971TM#0
    0460973TM#290#KKH#01102014#01102014#00000000
    0150205Test 1
    014021512345
    0200216Klingenhausen
    0210208093729451170
    01380000101
    014810000995
    01030002
    0133101Nachname
    0153102Stefan
    017310328031984
    01030042
    01430065.1.0
    0213107Musterstrasse 39
    011310939
    014311263927
    0183113Brgstadt
    0133217TM#D
    0093124
    0103114D
    01031081
    0103110M
    0193119V161309780
    0213635TM#999999901
    0213636TM#679999900
    014410112015
    017410200000000
    014410461125
    011410600
    01041071
    017410919012015
    017413320120701
    0104110*
    01641118018325
    0304134AOK Heilbronn-Franken
    01041310
    01041320
    01041211
    011412200
    017415001012015
    017415131032015
    017415231032015
    011423900
    0134402TM#0
    017500019012015
    01362011220
    0156203TM#?##
    0213635TM#999999901
    0213636TM#679999900
    014500103003
    0185098679999900
    0185099999999901
    017599925022015
    01362010952
    0156203TM#?##
    0213635TM#999999901
    0213636TM#679999900
    0246000Abdomenkarzinom
    0146001C76.2
    0106003G
    0186010TM#Falsch
    0136011TM#?
    017500031032015
    01362011221
    0156203TM#?##
    0213635TM#999999901
    0213636TM#679999900
    014500103220
    0185098679999900
    0185099999999901
    01380006200
    014810000290
    01030002
    0133101Mustermann
    0153102Stefan
    017310328031984
    017620031032015
    01362011221
    0156203TM#?##
    0213635TM#999999901
    0213636TM#679999900
    1216324$\TurboMed\Dokumente\PatBrief\201503\Weis19840328-2-962B0776-609A-4ce4-8B75-2BBCA87EDBB6.doc#wbr#Brief an #Brief
    01380006100
    014810000305
    01030002
    0133101Mustermann
    0153102Stefan
    017310328031984
    0193119V161309780
    0213107Hauptstr. 39
    011310939
    014311263927
    0183113Brgstadt
    0133217TM#D
    0093124
    01031081
    0103110M
    017361019012015
    0163631TM#Z0#0
    0213635TM#999999901
    014410461125
    01641118018325
    0143800TM#ja
    01380000023
    014810000056
    017920200002220
    0129203001
    01380000021
    014810000027
    Nein! Doch! OHH!

    samson schrieb:

    die rot geschriebene Zeile
    finden und was tun:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each line In IO.File.ReadLines("c:\Temp\Test.txt")
    3. If line.Contains("\"c) Then
    4. MessageBox.Show(line & Environment.NewLine & "was tun")
    5. End If
    6. Next
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    "was tun" sehe vielleicht so aus:

    VB.NET-Quellcode

    1. Dim line As String = "1216324$\TurboMed\Dokumente\PatBrief\201503\Weis19840328-2-962B0776-609A-4ce4-8B75-2BBCA87EDBB6.doc#wbr#Brief an #Brief"
    2. Dim newline As String = line.Remove(0, line.IndexOf("$")) ' alles vor dem "$" loeschen
    3. newline = newline.Remove(newline.IndexOf("#")) ' alles nach dem "#" loeschen (inkl. dem "#")
    4. MessageBox.Show(newline) ' newline ist nun der bereinigte Pfad

    Moin Moin erstmal wieder,

    erstmal vielen Dank an @RodFromGermany und @hirnwunde, hat alles soweit geklappt.
    Nun stehe ich vor der nächsten Hürde,... Ich bekomm ihn nicht davon überzeugt, den Dateipfad, so wie er in der Zeile steht anzulegen.
    Also Verzeichnis und Unterverzeichnis, und dann die Datei hinzukopieren. Er sagt mir immer, das er die Datei nicht anlegen kann.
    Wie mach ich das am besten, das er mir den "Verzeichnisbaum" anlegt?

    Vergesst es wieder :) Das Subdir hat er angelegt, aber ich muss den Dateinamen extrahieren und extra angeben... sonst wird das nix... Er hat mir ein Verzeichnis angelegt, mit dem Dateinamen :D
    Da war der Fehler :)
    Wäre das über Split eventuell möglich?
    Was ist wenn es ein Subdir mehr gibt?

    Anbei mal mein Code, wie er derzeit aussieht...

    VB.NET-Quellcode

    1. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    2. For Each line In IO.File.ReadLines(OpenFileDialog1.FileName)
    3. If line.Contains("6324$") Then
    4. Dim line2 As String = CStr(line)
    5. Dim newline As String = line2.Remove(0, line2.IndexOf("$")) ' alles vor dem "$" loeschen
    6. newline = newline.Remove(newline.IndexOf("#")) ' alles nach dem "#" loeschen (inkl. dem "#")
    7. Dim lastline = newline.Replace("$\TurboMed\", "")
    8. TextBox1.AppendText(FolderBrowserDialog2.SelectedPath + CStr("\") + lastline & Environment.NewLine)
    9. Dim copyline = FolderBrowserDialog2.SelectedPath + CStr("\") + lastline
    10. Dim Source As String = copyline
    11. Dim Destination As String = FolderBrowserDialog1.SelectedPath + CStr("\") + lastline
    12. If Directory.Exists(FolderBrowserDialog2.SelectedPath) Then
    13. Directory.CreateDirectory(Destination)
    14. System.IO.File.Copy(Source, Destination, False)
    15. End If
    16. End If
    17. Next
    18. End Sub


    Danke schon mal und Grüße Stefan
    Nein! Doch! OHH!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „samson“ ()

    samson schrieb:

    Verzeichnis
    Teste dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim pfad = "c:\temp\temp\temp\temp\temp\temp\temp\temp\temp\temp\xxx.txt"
    3. Dim fi = New IO.FileInfo(pfad)
    4. fi.Directory.Create()
    5. IO.File.WriteAllText(pfad, "bla")
    6. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    viel Spass :)

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim line As String = "1216324$\TurboMed\Dokumente\PatBrief\201503\Weis19840328-2-962B0776-609A-4ce4-8B75-2BBCA87EDBB6.doc#wbr#Brief an #Brief"
    3. Dim newline As String = line.Remove(0, line.IndexOf("$")) ' alles vor dem "$" loeschen
    4. newline = newline.Remove(newline.IndexOf("#")) ' alles nach dem "#" loeschen (inkl. dem "#")
    5. Dim pfadangabe, dateiname As String
    6. Dim temparr() As String
    7. Dim pos As Integer
    8. 'letztes Vorkommen eines Backslash "\"
    9. pos = newline.LastIndexOf("\")
    10. ' erzeugt ein Array aus allen Pfad-Elementen, der Trenner "\" wird verworfen
    11. temparr = Microsoft.VisualBasic.Strings.Split(newline, "\")
    12. ' Remove = Alles nach (inklusive) der Positionsangebe _pos_ wird geloescht
    13. pfadangabe = newline.Remove(pos)
    14. ' das letzte Element in diesem Array ist der Dateiname
    15. dateiname = temparr.Last
    16. MessageBox.Show(pfadangabe + Microsoft.VisualBasic.ControlChars.CrLf + dateiname)
    17. End Sub

    @hirnwunde Fast. ;)
    @samson Teste dies:

    VB.NET-Quellcode

    1. Dim line As String = "1216324$\TurboMed\Dokumente\PatBrief\201503\Weis19840328-2-962B0776-609A-4ce4-8B75-2BBCA87EDBB6.doc#wbr#Brief an #Brief"
    2. Dim newline As String = line.Remove(0, line.IndexOf("$") + 1) ' alles vor dem "$" loeschen (inkl "$")
    3. newline = newline.Remove(newline.IndexOf("#")) ' alles nach dem "#" loeschen (inkl. dem "#")
    4. ' Hier Deinen eigenen Pfad davorhängen und ggf. den Pfad selbst bearbeiten
    5. Dim pfad = "c:\temp\" & newline
    6. Dim fi = New IO.FileInfo(pfad) ' hier nur ein Text
    7. fi.Directory.Create()
    8. IO.File.WriteAllText(pfad, "bla")


    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nochmals danke an euch beide :)

    Hab es so nun hinbekommen

    VB.NET-Quellcode

    1. Dim sPath As String = FolderBrowserDialog1.SelectedPath + CStr("\") + IO.Path.GetDirectoryName(lastline)


    Gesamter Code:

    VB.NET-Quellcode

    1. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    2. Dim counter As Integer = 0
    3. For Each line In IO.File.ReadLines(OpenFileDialog1.FileName)
    4. If line.Contains("6324$") Then
    5. counter = counter + 1
    6. Label4.Text = counter
    7. Dim line2 As String = CStr(line) ' Pfad aus BDT inkl. Datei
    8. Dim newline As String = line2.Remove(0, line2.IndexOf("$")) ' alles vor dem "$" loeschen
    9. newline = newline.Remove(newline.IndexOf("#")) ' alles nach dem "#" loeschen (inkl. dem "#")
    10. Dim lastline = newline.Replace("$\TurboMed\", "") ' $\TurboMed\ entfernen
    11. Dim source = FolderBrowserDialog2.SelectedPath + CStr("\") + lastline
    12. TextBox1.AppendText(CStr("\") + lastline & Environment.NewLine) ' Pfad ausgeben mit TM-Pfad
    13. Dim copyline = FolderBrowserDialog2.SelectedPath + CStr("\") + lastline
    14. Dim Destination As String = FolderBrowserDialog1.SelectedPath + CStr("\") + lastline
    15. Dim sPath As String = FolderBrowserDialog1.SelectedPath + CStr("\") + IO.Path.GetDirectoryName(lastline)
    16. If Directory.Exists(FolderBrowserDialog2.SelectedPath) Then
    17. Directory.CreateDirectory(sPath)
    18. System.IO.File.Copy(Source, Destination, False)
    19. End If
    20. End If
    21. Next
    22. End Sub
    Nein! Doch! OHH!

    samson schrieb:

    Hab es so nun hinbekommen


    Das ist doch das wichtigste ;)
    Mir geht es auch oft so, das ich Code-Schnipsel finde und waerendessen ich programiere ich andere Methoden kennenlerne bzw. andere Einfälle bzgl. Lösungswegen bekomme :)


    @RodFromGermany
    Geht doch ... zumindest bei mir (siehe Anhang)
    Bilder
    • Unbenannt.jpg

      69,67 kB, 1.083×140, 130 mal angesehen

    hirnwunde schrieb:

    zumindest bei mir
    Ich habe eine Datei erzeugt. Du auch :?: ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hirnwunde schrieb:

    Und das habe ich gelöst
    allerdings mit nicht ganz optimalen Methoden.
    Dateinamen und Pfade gehören in eine IO.FileInfo oder IO.DirectoryInfo.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hirnwunde schrieb:

    kein File.IO-Objekt
    IO.FileInfo, IO.DirectoryInfo, nix File.IO.

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim pfad = "c:\temp\temp\temp\temp\temp\temp\temp\temp\temp\temp\xxx.txt"
    2. Dim fi = New IO.FileInfo(pfad)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany hätte da doch noch eine kleine Frage...
    Wie kann ich am einfachsten den Text

    VB.NET-Quellcode

    1. TextBox1.AppendText(CStr("\") + lastline & Environment.NewLine) ' Pfad ausgeben mit TM-Pfad

    den ich in TextBox1 ausgebe parallel noch in eine Logdatei ausgeben?
    Danke schon mal :)
    Nein! Doch! OHH!

    samson schrieb:

    parallel noch in eine Logdatei

    VB.NET-Quellcode

    1. Dim txt = "bla"
    2. TextBox1.AppendText(txt)
    3. IO.File.AppendText(DEINE_DATEI, txt)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!