Textdatei auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    razzzer530i schrieb:

    Geht jetzt weiter ...
    Das ist nun die Frage.
    Dein Code ist voll von schlechtem Stil, und - falls du Programmieren lernen willst - täte ich empfehlen, jetzt innezuhalten, und erstmal den Code-Crap auszumisten - da ist jede Menge zu tun.

    Andernfalls wirst du weiter so programmieren, und - sorry - immer mehr Crap produzieren, und je länger du das treibst, desto mühsamer wird es, deinen Stil zu ändern, wenn du auf diese Schmuddel-Weise mal nicht mehr weiter kommst.

    Das wichtigste - und gleichzeitig mühsamste wird dieser Punkt sein: Visual Studio - Empfohlene Einstellungen
    Das wird vmtl. allerlei Fragen aufwerfen, aber dazu sind wir ja da.

    Falls du's ohne Rückfragen "schaffst" täte ich empfehlen, dein Ergebnis zu posten, denn meist bauen Einzelkämpfer da gleich den nächsten Unfug ein.

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

    Jou.

    razzzer530i schrieb:

    VB.NET-Quellcode

    1. Option Strict Off
    Fang an und lösch diese Zeile oder ändere sie um in

    VB.NET-Quellcode

    1. Option Strict On
    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!
    Hatte ich nur off um mir nen integer im debug anzuzeigen, sorry.

    Werde mich dran machen und ihn überarbeiten. Wenn er dann mal fertig ist poste ich den wieder.

    Hab da allerdings noch eine kleine Frage wo wir schon beim schlechten Stil sind.

    Ich habe files:
    1.$01
    1.$02
    1.$03
    Diese Files sind Anhänge, die dann ja quasi von 1.$01 bis 1.$99 gehen können.
    Will jetzt alle löschen bis auf 1.$00

    Gibt es dafür eine kurze schöne Variante?
    Bin gerne bereit mich zu bessern

    Zitat entfernt. ~Thunderbolt
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    @razzzer530i Mit Dim AllFi = New DirectoryInfo(VERZEICHNIS).GetFiles(EXTENSION, OPTION) holst Du Dir ein Array der betreffenden FileInfo()-Instanzen.
    Mit For Each fi In AllFi gehst Du die durch, testest die Namen und löschst die nicht gewollten mit fi.Delete().
    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!

    razzzer530i schrieb:

    Hatte ich nur off um mir nen integer im debug anzuzeigen

    Um eine Variable vom Datentyp Integer anzuzeigen, einfach in einen String konvertieren.

    VB.NET-Quellcode

    1. Dim int As Integer = 123
    2. MessageBox.Show(int.ToString)
    @Pasta Zum Debuggen sollte man keine MessageBox verwenden, da gibt es Methoden ohne zu editieren. Gugst Du hier.
    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!
    Mache ich auch nicht, das soll die Funktionsweise aufzeigen.
    Aber es ist es wohl besser, es so ..

    VB.NET-Quellcode

    1. Dim i As Integer = 123
    2. Dim str As String = i.ToString
    .. zu machen.

    Pasta schrieb:

    die Funktionsweise
    beim Debuggen ist so, ein ToString kommt da nicht vor:


    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!
    Danke erstmal. Noch eine kurze Frage:

    Unterscheidet vb eigentlich z.b. bei f.contains oder f.endswith ob der String groß oder klein geschrieben ist?

    Also differenziert VB zwischen HALLO und hallo ?

    LG
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    ob der String groß oder klein geschrieben ist?
    Ja.
    Besser ist es, Du konvertierst den String mit .ToLower() in Kleinbuchstaben und testest dann, wenn Du Case-Insensitivität benötigst.
    Die Überladungen sind da nicht so elegant, da .Contains() kein Case-Sensitivity-Boolean hat, nur .EndsWith().
    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 Ich habe das Wort "debug" übersehen, daher bezog sich mein post nicht auf das debugging.
    Das ganze sollte nur zeigen, wie man einen Integer anzeigen lassen kann, daß ich MessageBox schreibe, um das zu verdeutlichen, ist wohl eine schlechte Angewohnheit.
    Hab alle meine Fragen klären können :)

    Da komme ich aber noch zu einem 3. Problem:

    Ich lese per VBA eine Datei ein und entschlüssel sie. In excel sieht das so aus

    ------------------------------
    Lars Dieter | C:\x\y\z |
    ------------------------------
    Karl Heinz | C:\x\z\1 |
    ------------------------------
    Jürgen | C..... | <-----------Jürgen wird in der Excel datei richtig dargestellt. Jetzt speichere ich das ganze in einer txt datei.


    In der txt kommt aber nur

    Jrgen an.
    Klar ist mir, dass das Ü nicht verloren gegangen ist. Über cmd>pfad>nc kann ich mir ja auch den ASC wert anzeigen.ASC(129)

    Wenn ich jetzt mit der Datei weiterarbeiten will, funktioniert das aber nicht.
    Egal ob ich beim Einlesen name.replace(name, "", ASC(129)) mache oder sonst was, ich kann den Namen nicht in der Txt finden.

    Hab ich die Möglichkeit, bereits in Excel das Problem zu beseitigen?

    Guckt euch mal den Code an:
    Modul modEncrypt

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Splitten()
    3. Dim arr As Variant
    4. Dim intFile As Integer
    5. Dim dblAnf As Double
    6. Dim dblLen As Double
    7. Dim lngAkt As Long
    8. Dim lngRow1 As Long
    9. Dim lngRow2 As Long
    10. Dim strDatei As String
    11. Dim strMain As String
    12. Dim wks As Worksheet
    13. dblAnf = Now
    14. Set wks = Sheets("Test")
    15. wks.Rows("3:65535").Delete
    16. wks.Rows(2).ClearContents
    17. lngRow1 = 2
    18. lngRow2 = 3
    19. wks.Cells(lngRow1, 2) = "pfad"
    20. While wks.Cells(lngRow1, 2) <> ""
    21. strDatei = wks.Cells(lngRow1, 2) & "\ARCHIVE.DAT"
    22. If Dir(strDatei) <> "" Then
    23. dblLen = FileLen(strDatei)
    24. If wks.Cells(lngRow1, 3) >= 1 Then
    25. intFile = FreeFile
    26. Open strDatei For Binary As #intFile Len = 430
    27. strMain = Space(430)
    28. Get #intFile, dblLen - 429, strMain
    29. Close #intFile
    30. arr = DavidWerte(strMain)
    31. End If
    32. End If
    33. strDatei = wks.Cells(lngRow1, 2) & "\ARCHIVE.DIR"
    34. If Dir(strDatei) <> "" Then
    35. intFile = FreeFile
    36. Open strDatei For Binary As #intFile
    37. strMain = Space(LOF(intFile))
    38. Get #intFile, 1, strMain
    39. Close #intFile
    40. For lngAkt = 1 To Len(strMain) Step 430
    41. arr = DavidWerte(Mid(strMain, lngAkt, 430))
    42. wks.Cells(lngRow2, 2) = arr(0)
    43. wks.Cells(lngRow2, 1) = arr(1)
    44. lngRow2 = lngRow2 + 1
    45. Next lngAkt
    46. End If
    47. lngRow1 = lngRow1 + 1
    48. Wend
    49. End Sub
    50. Function DavidWerte(ByVal strBlock As String) As Variant
    51. Dim datFirst As Date
    52. Dim intPos As Integer
    53. Dim dblBS1 As Double
    54. Dim dblBS2 As Double
    55. Dim dblBS3 As Double
    56. Dim dblBS4 As Double
    57. Dim dblWert As Double
    58. Dim strDat As String
    59. Dim strTemp As String
    60. Dim DVWerte(3) As String
    61. datFirst = DateSerial(1970, 1, 1)
    62. dblBS1 = 1
    63. dblBS2 = 256
    64. dblBS3 = 65536
    65. dblBS4 = 16777216
    66. strDat = Mid(strBlock, 23, 4)
    67. dblWert = Asc(Mid(strDat, 1, 1)) * dblBS1 + _
    68. Asc(Mid(strDat, 2, 1)) * dblBS2 + _
    69. Asc(Mid(strDat, 3, 1)) * dblBS3 + _
    70. Asc(Mid(strDat, 4, 1)) * dblBS4
    71. DVWerte(2) = datFirst + (dblWert / 86400)
    72. strBlock = Mid(strBlock, 114, Len(strBlock))
    73. intPos = InStr(strBlock & Chr(3), Chr(3))
    74. DVWerte(0) = Mid(strBlock, intPos + 1, Len(strBlock))
    75. DVWerte(0) = Left(DVWerte(0), InStr(DVWerte(0) & Chr(0), Chr(0)) - 1)
    76. intPos = InStr(strBlock & Chr(4), Chr(4))
    77. DVWerte(1) = Mid(strBlock, intPos + 1, Len(strBlock))
    78. DVWerte(1) = Left(DVWerte(1), InStr(DVWerte(1) & Chr(0), Chr(0)) - 1)
    79. DavidWerte = DVWerte
    80. End Function



    Worksheet

    Visual Basic-Quellcode

    1. Private Sub CMDStart_Click()
    2. Dim arr As Variant
    3. Dim intFile As Integer
    4. Dim dblAnf As Double
    5. Dim dblLen As Double
    6. Dim lngAkt As Long
    7. Dim lngRow1 As Long
    8. Dim lngRow2 As Long
    9. Dim strDatei As String
    10. Dim strMain As String
    11. Dim wks As Worksheet
    12. dblAnf = Now
    13. Set wks = Sheets("Test")
    14. wks.Rows("3:65535").Delete
    15. wks.Rows(2).ClearContents
    16. lngRow1 = 2
    17. lngRow2 = 3
    18. wks.Cells(lngRow1, 1) = "pfad"
    19. While wks.Cells(lngRow1, 1) <> ""
    20. strDatei = wks.Cells(lngRow1, 1) & "\ARCHIVE.DAT"
    21. If Dir(strDatei) <> "" Then
    22. dblLen = FileLen(strDatei)
    23. If wks.Cells(lngRow1, 3) >= 1 Then
    24. intFile = FreeFile
    25. Open strDatei For Binary As #intFile Len = 430
    26. strMain = Space(430)
    27. Get #intFile, dblLen - 429, strMain
    28. Close #intFile
    29. arr = DavidWerte(strMain)
    30. End If
    31. End If
    32. strDatei = wks.Cells(lngRow1, 1) & "\ARCHIVE.DIR"
    33. If Dir(strDatei) <> "" Then
    34. intFile = FreeFile
    35. Open strDatei For Binary As #intFile
    36. strMain = Space(LOF(intFile))
    37. Get #intFile, 1, strMain
    38. Close #intFile
    39. For lngAkt = 1 To Len(strMain) Step 430
    40. arr = DavidWerte(Mid(strMain, lngAkt, 430))
    41. wks.Cells(lngRow2, 1) = arr(0)
    42. wks.Cells(lngRow2, 2) = arr(1)
    43. lngRow2 = lngRow2 + 1
    44. Next lngAkt
    45. End If
    46. lngRow1 = lngRow1 + 1
    47. Wend
    48. MsgBox "Dauer: " & Now - dblAnf
    49. End Sub


    Verstehe nicht so ganz wieso es nicht klappt
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Klar ist mir, dass das Ü nicht verloren gegangen ist.
    Gibt es dort beim Speichern so was wie das Encoding in .NET?
    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!
    Problem gefunden. Wenn ich mit Excel die Datei auslese, passiert es schon, dass in Excel die Umlaute nicht übernommen werden.
    In Excel selbst werden sie mir schon nicht mehr angezeigt. Ich hole mir die Daten aus .dat und .dir Dateien.

    Jemand ne Idee wie ich das anders machen kann ?
    Bzw so, dass die Umlaute mit übernommen werden?

    Antwort gefunden>>

    Beim Einlesen in Excel einfach eine kleine Funktion schreiben die die ASCII-Zeichen umbenennt.

    Visual Basic-Quellcode

    1. Function ReName(byval strCh as string)
    2. strCh=replace(strCh, Chr(129),"ue")
    3. ' usw
    4. ReName=strCh
    5. End Function


    macht aus ü(welches man in der gespeicherten txt nicht sehen kann) ue, was deutlich besser zu handlen ist.

    Nur falls irgendjemand das mal brauchen sollte und noch nicht kann oder weiß.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „razzzer530i“ ()