vb6 zu vb.net: Datei lesen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von tina83.

    vb6 zu vb.net: Datei lesen

    Hallo zusammen,

    grade bin ich dabei ein Programm mit VB6 zu VB.NET komplett umzuschreiben. Mittlerweile bin ich zu einem für mich unlösbaren Problem gekommen. In VB6 werden txt-Dateien gespeichert und aus diesen gelesen, in VB.NET geht das ja auch. Das hab ich auch hinbekommen. Das Problem dabei ist der Inhalt der txt-Datei. Manche Zeilen haben nur kryptische Zeichen - und ich weiß nicht wo die her kommen und wie man die wieder lesen kann. Hier ein Beispiel aus der txt-Datei:

    Quellcode

    1. Durchmesser
    2. 02.09.2013 HC Kunde HC Kunde Ort 1 BFR Durchmesser - Messung ÿÿ ÿÿ fÉE ÉE3ÉEš ÉE p÷D3s÷Dfv÷D3s÷D f&ùDf&ùD3#ùDf&ùD fÖÈEfÉE ÿC¬ ”AÑ|<À ðÈEfîÈEfòÈE ðÈE ÍüøD ðøDföøDföøD ÍŒùD pùDf†ùD €ùD ÍxÈEfîÈE ÿCkB‚âÅÀ šÉEÍ ÉE3ÉE3ÉE 3£ùDš™ùD °ùD3£ùD Í\ùD3CùD @ùDšIùD š©ÈE3ÉE ÿCéIBQûªÀ

    Nicht wundern: die Datei sieht wirklich so aus. "Durchmesser" (Dateikennung) ist in Zeile 1, alles andere in Zeile 2

    in VB6 wird das so gespeichert:

    Visual Basic-Quellcode

    1. Sub Save_Durchmesser()
    2. Put #FileNum, 1, Dateikennung
    3. Put #FileNum, 2, Messdatum
    4. Put #FileNum, 3, Kennwort
    5. Put #FileNum, 4, Kunde
    6. Put #FileNum, 5, Ort
    7. Put #FileNum, 6, Ofen_Nr
    8. Put #FileNum, 7, Ofenabmessung
    9. Put #FileNum, 8, Anzahl_Stationen
    10. Put #FileNum, 9, Messender
    11. Put #FileNum, 10, Bemerkung_Husky
    12. Put #FileNum, 11, Position_Ritzel
    13. Put #FileNum, 12, Position_Zahnkranz
    14. Put #FileNum, 13, Antriebsstation
    15. Put #FileNum, 14, Entfernung_Zk_LR
    16. N = 14
    17. For i = 1 To Anzahl_Stationen
    18. N = N + 1
    19. Put #FileNum, N, Position_Längsführung(i)
    20. Next i
    21. N = N + 1
    22. Put #FileNum, N, Planetenkühler
    23. For i = 1 To Anzahl_Stationen
    24. N = N + 1
    25. Durchmesserwerte_Alle.Wert_D1 = A_Durchmesser_LR(i)
    26. Durchmesserwerte_Alle.Wert_D2 = B_Durchmesser_LR(i)
    27. Durchmesserwerte_Alle.Wert_D3 = C_Durchmesser_LR(i)
    28. Durchmesserwerte_Alle.Wert_D4 = Durchmesser_LR(i)
    29. Put #FileNum%, N, Durchmesserwerte_Alle
    30. N = N + 1
    31. Durchmesserwerte_Alle.Wert_D1 = A_Durchmesser_L_R(i)
    32. Durchmesserwerte_Alle.Wert_D2 = B_Durchmesser_L_R(i)
    33. Durchmesserwerte_Alle.Wert_D3 = C_Durchmesser_L_R(i)
    34. Durchmesserwerte_Alle.Wert_D4 = Durchmesser_L_R(i)
    35. Put #FileNum%, N, Durchmesserwerte_Alle
    36. N = N + 1
    37. Durchmesserwerte_Alle.Wert_D1 = A_Durchmesser_R_R(i)
    38. Durchmesserwerte_Alle.Wert_D2 = B_Durchmesser_R_R(i)
    39. Durchmesserwerte_Alle.Wert_D3 = C_Durchmesser_R_R(i)
    40. Durchmesserwerte_Alle.Wert_D4 = Durchmesser_R_R(i)
    41. Put #FileNum%, N, Durchmesserwerte_Alle
    42. N = N + 1
    43. Relativberechnung.Wert_RA1 = Meßwert_Relativ(i)
    44. 'Relativberechnung.Wert_RA2 = LR_Zuordnung(i)
    45. Relativberechnung.Wert_RA2 = LR_Meßwert(i)
    46. Relativberechnung.Wert_RA3 = Wanddicke_LR(i)
    47. Relativberechnung.Wert_RA4 = Relativbewegung(i)
    48. Relativberechnung.Wert_RA5 = Höhenkorrektur(i)
    49. Put #FileNum%, N, Relativberechnung
    50. Next i
    51. End Sub


    Visual Basic-Quellcode

    1. FileNum = FreeFile
    2. Open Dateiname For Random As FileNum
    3. Call Save_Durchmesser
    4. Close #FileNum



    So, und jetzt die Frage: Warum kommen solche kryptischen Zeichen? Und wie kann ich diese in VB.NET auslesen?

    Ich hoffe ihr könnt mir helfen.

    Danke!
    @tina83 Die Frage ist, was für einen Zeichensatz Du verwendest. In .NET heißt das Encoding. Probier mal als 2. Parameter beim Read / Write ein Encoding.Default.
    ------
    Du solltest zunächst Deinen Code auf .NET-File-Prozessing umstellen.
    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!

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

    tina83 schrieb:

    .NET-File-Prozessin
    z.B.
    System.IO.FileStream
    System.IO.StreamReader
    System.IO.File.ReadAllBytes
    ...
    SDa findest Du hier im Forum beliebig viele Beispiele.
    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!
    @ErfinderDesRades Guter Einwurf.
    @tina83 Kann es sein, dass da komplette Strukturen abgespeichert wurden?
    Hast Du den Save-Code davon?
    ----
    Hab ihn geseten.
    Da werden Binary-Variablen geschrieben.
    Da hilft ein System.IO.BinaryReader, da musst Du die Strukturen variablenweise einlesen.
    Achte darauf, dass ein VB6-Long ein .NET-Integer ist.
    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!

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

    Das ganz oben ist schon der Save-Code.

    In den Variablen verbergen sich Strings und Zahlen.

    ich würde sagen, das ist eindeutig keine Textdatei. Da helfen Encodings nicht weiter, sondern die ist kaputt.

    naja, das würde ich nicht unbedingt sagen. Diese Datei kann mit von dem alten VB6-Programm gelesen werden. Und da stehen wichtige Daten drin, die im Programm verwendet werden. Füge ich im VB6 nen Haltepunkt ein und lasse Zeile für Zeile beim einlesen durchlaufen, füllt sich jede Variable mit dem entsprechenden Werten. Also muss das Ding ja irgendwie zu verwenden sein.

    Kann es denn sein, dass die Datei binär gespeichert ist und nur beim Öffnen mit einem Editor o.ä. diese kryptische Zeichen anzeigt?

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

    tina83 schrieb:

    Kann es denn sein, dass die Datei binär gespeichert
    Ja, so sieht es aus, ich hab meinen Post über Dir editiert.
    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 schrieb:

    Da werden Binary-Variablen geschrieben.
    Da hilft ein System.IO.BinaryReader, da musst Du die Strukturen variablenweise einlesen.


    Kann mir einer sagen wie ich das am besten einlese? Ich verzweifel da grad bissl dran. Folgendes hab ich bis jetzt:

    VB.NET-Quellcode

    1. Using reader As BinaryReader = New BinaryReader(File.Open(Datei_Pfad & "\" & Dateiname, FileMode.Open))
    2. Dim pos As Integer = 0
    3. Dim length As Integer = reader.BaseStream.Length
    4. While pos < length
    5. Dim value As String = reader.ReadString
    6. ListBox1.Items.Add(value)
    7. ' Add length in bytes to Position.
    8. pos += 1
    9. End While
    10. End Using

    Dabei kommt nicht wirklich viel rum. In die Listbox werden vor allem leere Zeichen geschrieben, nur 2 kleine Bruchteile von 2 Strings sind darunter. Wie bekomme ich den ganzen Rest mit rein?
    Les ich das ganze mit

    VB.NET-Quellcode

    1. Dim value As Integer = reader.ReadInt32()
    ein, siehts nach mehr aus. Es sind wenigstens allerhand Zahlen da und viele Nuller.

    Woher weiß ich denn an welcher Position ich was finde? Laut VB6-Code geht es ja nacheinander, aber wie viel Positionen sind dazwischen?

    tina83 schrieb:

    VB.NET-Quellcode

    1. reader.ReadString
    wird so nicht funktionieren, da Strings in .NET völlig anders funktionieren als in VB6.
    Du musst die Länge der VB6-Strings kennen, genau so viele Bytes einlesen und dann diese Bytes mit dem entsprechenden Encoding in einen .NET-String konvertieren.
    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!
    Der BinaryReader liest auch ein Item nach dem anneren - man muss ihm keine Position sagen.
    Man muss ihm sage, **was** er lesen soll, ob .ReadInt32(), .ReadString(), .ReadDate() or whatever.
    Und diese Aufrufe müssen natürlich in der richtigen reihenfolge kommen, in der die Daten in der Datei auch drinnestehen.

    So geht das, wenn es gut geht.
    Nun ist bei dir aber die Datei mit vb6-Put geschrieben, und ich habe große Zweifel, dass was mit vb6.Put geschrieben wurde mit vb.Net.BinaryReader.ReadXY lesbar ist.

    Weil konzipiert ist der BinaryReader zum Lesen von Dateien, die mit einem BinaryWriter geschrieben wurden, nicht für was geputtet wurde.

    Am Ende wirst du erst noch ein vb6 Proggi schreiben müssen, was all diese Dateien ins Xml-Format konvertiert, weil das ist ein Standard, den sowohl vb6 produzieren kann als auch vbnet lesen.

    Edit: Hey, guckma, was ich im olleSchrott-Namespace gefunden habe:
    ganz viele Microsoft.VisualBasic.FileSystem.FileGet()-Überladungen.
    Denen trau ich schon eher zu, dass sie was vb6-geputtetes auch lesen können.
    Aber sicher binnich natürlich nicht.

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

    Hi
    Ich glaube das ist eine typisierte Datei. Früher unter Q-Basic auch direkt zugriffs Datei genannt. (Das war schon sowas wie eine kleine Datenbank ;-)).
    aber guckst du mal da: activevb.de/tutorials/tut_rdmfiles/rdmfiles.html
    Tip: Selbst wenn du es hinbekommst die daten aus der Datei zu lesen und zu schreiben würde ich aber nicht damit weiter arbeiten.
    Meine erste Idee währe die Daten in dem VB6 Programm in eine Textdatei zeilenweise zu schreiben und die einzelnen Datensätze mit ";" zu trennen.
    Mit der Datei kannst du dann in VB.Net weiterarbeiten und in eine Datenbank speichern.
    Von Datenbank täte ich abraten, bis zu wasweißich 20000 Datensätzen kann man in einem typisierten Dataset verarbeiten, und direkt auf Platte speichern.
    Falls sich später ergibt, dass doch eine DB erforderlich ist, kann man die noch später hinterlegen.
    Je später man die Hinterlegung macht, desto besser - hingegen das typDataset braucht man so oder, ob nun mit DB oder ohne.

    Viel wichtiger als die Daten-Persistenz ist nämlich die Daten-Verarbeitung und -Präsentation.
    Gugge vier Views-Videos
    und zur Persistenz Daten laden und speichern

    Eierlein schrieb:

    Das kann man nur beantworten, wenn du verrätst, was sich hinter
    Messdatum, Kennwort, Kunde, usw. und Durchmesserwerte_Alle verbirgt.


    Visual Basic-Quellcode

    1. Dim Dateikennung As String, Anzahl_Stationen As Integer
    2. Dim Messdatum As String, Kunde As String, Ort As String, Kennwort As String, Ofen_Nr As String, Ofenabmessung As String, Messender As String, Bemerkung_Husky As String
    3. Dim Antriebsstation As Integer, Position_Ritzel As Integer, Position_Zahnkranz As Integer, Entfernung_Zk_LR As Integer, Planetenkühler As Integer, Position_Längsführung(8) As Integer
    4. Dim Durchmesser_L_R() As Single, A_Durchmesser_L_R() As Single, B_Durchmesser_L_R() As Single, C_Durchmesser_L_R() As Single
    5. Dim Durchmesser_R_R() As Single, A_Durchmesser_R_R() As Single, B_Durchmesser_R_R() As Single, C_Durchmesser_R_R() As Single
    6. Dim Durchmesser_LR() As Single, A_Durchmesser_LR() As Single, B_Durchmesser_LR() As Single, C_Durchmesser_LR() As Single
    7. Dim Relativbewegung() As Single, Höhenkorrektur() As Single, Meßwert_Relativ() As Single, Wanddicke_LR() As Single, LR_Meßwert() As Single
    8. Dim Durchmesserwerte_Alle As Durchmesser_Alle
    9. Dim Relativberechnung As Relativ_Alle


    Messdatum = "01.10.2014"
    Kennwort = "irgendwas"
    Kunde = "NamevomKunden"
    usw.

    Durchmesser_Alle ist im Modul so deklariert:

    Visual Basic-Quellcode

    1. Type Durchmesser_Alle
    2. Wert_D1 As Single
    3. Wert_D2 As Single
    4. Wert_D3 As Single
    5. Wert_D4 As Single
    6. End Type

    ebenso Relativ_Alle

    In den Strings stehen ganz normale Texte drin, bei Integer zwangsläufig Zahlen
    In VB6 werden txt-Dateien gespeichert und aus diesen gelesen, in VB.NET geht das ja auch. Das hab ich auch hinbekommen.


    Du speicherst die Dateien in VB6 als RANDOM-Dateien.

    Das Problem dabei ist der Inhalt der txt-Datei.Manche Zeilen haben nur kryptische Zeichen …

    Es ist eben eine RANDOM-Datei.
    Z. B. wird die Single-Zahl 23.55 als ff¼A gespeichert.

    Wenn das Format der Datei beibehalten werden soll (muss), kannst du die Dateien so bearbeiten:

    VB.NET-Quellcode

    1. 'Datei öffnen
    2. Dim fileNum As Integer
    3. fileNum = FreeFile()
    4. FileOpen(fileNum, Dateiname, OpenMode.Random)
    5. Save_Durchmesser
    6. FileClose(fileNum)

    Datesatz schreiben:

    VB.NET-Quellcode

    1. Statt
    2. Put #FileNum, 1, Dateikennung
    3. FilePut(fileNum, Dateikennung, 1)

    Datensatz lesen:

    VB.NET-Quellcode

    1. Statt
    2. Get #Filenum, 5, Ort
    3. FileGet(fileNum, Ort, 5)


    Damit mit VB6 erstellte Dateien richtig mit vb.net gelesen werden können müssen alle Integer durch Short ersetzt werden!

    Also: Statt Dim xx as Integer - Dim xx as Short

    Übrigens: Die Datesatzlänge bei Random-Dateien ist, ohne Längenangabe, 128. (Bei VB.net genauso wie bei VB6).
    hm, also das lesen funktioniert schon mal nicht. Die ersten 7 Zeilen sind "" und bei der 8. Zeile gibt's nen Abbruch:
    Ein Ausnahmefehler des Typs "System.IO.EndOfStreamException" ist in Microsoft.VisualBasic.dll aufgetreten.
    Zusätzliche Informationen: Über das Ende des Datenstroms hinaus kann nicht gelesen werden.