GDT Schnittstelle (Textfile) auslesen und ausgeben

  • VB.NET

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

    GDT Schnittstelle (Textfile) auslesen und ausgeben

    Moin Moin zusammen,

    ich bin momentan dabei, eine GDT Datei auszulesen, jedoch komm ich nicht ganz klar...
    Hier mal den Inhalt der Datei:

    Quellcode

    1. 01380006302
    2. 014810000227
    3. 0098315
    4. 0178316
    5. 0099218
    6. 01230004-2
    7. 0093100
    8. 0193101Mustermann
    9. 0163102Manfred
    10. 017310322072007
    11. 0093104
    12. 01931051234567489
    13. 027310612345 Musterhausen
    14. 0233107Musterstraße 5
    15. 01031081
    16. 01031101


    Kurz zur Erklärung,...
    die ersten 3 Zahlenstellen beinhalten die Zeichenlänge inkl. CR und LF

    Danach kommt eine Feldkennung, Beispiel: 3106 = Postleitzahl und Ort oder 3107 Straße und Hausnummer
    Gefolgt vom Wert, oder Inhalt der Feldkennung,...

    Wie bekomme ich hier die Werte für Vorname (3102) und Nachname (3101) sauber rausgelesen?

    vielen lieben Dankund Grüße,

    samson

    PS: Derzeit bin ich schon soweit:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Collections
    4. Public Class Form1
    5. Dim myArray As String()
    6. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    7. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    8. Me.Location = New Point(1680, 0)
    9. Me.Size = New Point(1680, 1050)
    10. myArray = System.IO.File.ReadAllLines("c:\auto_gdt\export.gdt")
    11. Dim Line As String
    12. For Each Line In myArray
    13. MsgBox(Line)
    14. Next
    15. End Sub
    16. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    17. Application.Exit()
    18. End Sub
    19. End Class


    Umlaute werden derzeit ebenfalls fehlerhaft dargestellt (ß als ?)
    Nein! Doch! OHH!

    samson schrieb:

    fehlerhaft dargestellt
    Probier mal

    VB.NET-Quellcode

    1. myArray = System.IO.File.ReadAllLines("c:\auto_gdt\export.gdt", System.Text.Encoding.Default)
    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!
    Wie bekomme ich hier die Werte für Vorname (3102) und Nachname (3101) sauber rausgelesen?


    Zum Beispiel:

    Quellcode

    1. ...
    2. if zeile.substring(3,4) = "3102" then vorname = zeile.substring(7)


    Umlaute werden derzeit ebenfalls fehlerhaft dargestellt (ß als ?)

    Versuch' encoding.default.

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

    Eierlein schrieb:

    Zum Beispie
    mit 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!
    Danke an @RodFromGermany und @Eierlein erstmal...
    Option Strict On habe ich ganz oben stehen ;)
    @Eierlein Wenn ich jedoch Zeilenweise auslesen will so wie in deinem Beispiel, muss ich da nicht dann die ReadAllLines anders machen...?
    Oder weiterhin mit array?
    Nein! Doch! OHH!

    samson schrieb:

    ReadAllLines
    Mit IO.File.ReadAllLines() werden alle Zeilen der Datei in einem String-Array abgelegt.
    Eine Alternative wäre

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines("DEINE_DATEI")
    2. MessageBox.Show(line)
    3. Next
    da werden die Zeilen einzeln durchiteriert, das benötigt praktisch keinen Speicherplatz.
    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
    Das würde ja bedeuten, ich könnte darin direkt die If Abfrage gestalten oder nicht?

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines("DEINE_DATEI")
    2. if line.substring(3,4) = "3102" then vorname = line.substring(7) 'Wobei das doch eigentlich keinen Sinn ergibt.
    3. Next

    Ich müsste ja eigentlich generell die ganze Datei durchsuchen, es kann ja durchaus passieren, das ein anderes System die GDT Datei in einer anderen Reihenfolge erstellt.
    Es ist ja nicht gesagt, das die GDT Datei immer in der gleichen Sortierung aufgebaut ist.
    Wäre es dann nicht Sinnvoller die Daten aus dem Array nacheinander in die My.Settings zu schreiben, dort dann abzufragen?

    VB.NET-Quellcode

    1. myArray = System.IO.File.ReadAllLines("c:\auto_gdt\export.gdt", System.Text.Encoding.Default)
    2. Dim LineCount As Integer = myArray.Count
    3. For Each line In myArray
    4. if line.substring(3,4) = "3101" then My.Settings.Nachname = line.substring(7)
    5. if line.substring(3,4) = "3110" then
    6. if lin.substring(7,1) = "1" then
    7. My.Settings.Geschlecht = "Herr"
    8. else
    9. My.Settings.Geschlecht = "Frau"
    10. Next


    oder denke ich da etwas zu kompliziert?
    Nein! Doch! OHH!
    ich empfehle neuerdings öfter, zunächst die ganz einfachen Vorraussetzungen zu schaffen, bevor man sich an knifflige Algorithmen macht.
    Also bevor Samson nicht eine Datensatz-Klasse geschaffen hat, mit Properties für PLZ, Strasse, Hausnr, Name und wasweißich, wasser auslesen will, kann man nicht mittm Auslesen beginnen.

    @Samson: Wie sieht deine Datensatz-Klasse aus - dann kann man einen Algo entwerfen, der sone Datei einliest und eine List(Of T) mit Daten befüllt.

    achso - sehe ich das richtig, dass eine Datei nur einen einzigen Datensatz enthält?

    samson schrieb:

    oder denke ich da etwas zu kompliziert?
    Ich glaube ja.
    Du solltest Dich mal mit dem Konzept des Debuggens befassen, gugst Du hier.
    Du musst lernen zu überprüfen, was Dein Programm tatsächlich macht.
    Also: Haltepunkt reinsetzen, den Code zeilenweise abarbeiten und den Inhalt der relevanten Variablen überwachen.
    Da siehst Du sehr schnell, was zu optimieren ist.
    Und:
    Es gibt nur 2 Geschlechter, ein Boolean reicht also. ;)
    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 Richtig, Es wird aus dem "SourceProgramm" immer nur eine Datei erstellt, hier steht dann die "Stamminformation" über die Person drin.
    Das übliche: Name, Vorname, Geschlecht, Straße + HausNr., PLZ + Ort, Geburtsdatum, Welche GDT Version verwendet wird, wie das "SourceProgramm" heißt was die Datei erstellt,...

    Ich brauche hier aus der Datei eigentlich nur die Information über Geschlecht, und Nachname...

    Hier mal das was ich generell vorhabe...

    Es soll eine "Server / Client" Version werden...

    Der Server gibt nur die Daten aus, die er per TCP oder Dateitransfer erhält. (Patientenaufruf im Wartezimmer)
    Der Client erstellt die GDT Datei, hier wird dann der Client über das Praxissystem gestartet, die Datei wird erstellt und eingelesen,...
    Nun hat der Arzt oder die Arzthelferin die Möglichkeit noch auszuwählen, welches Zimmer, ob der Patient anhand der PatientenID oder anhand des Nachnamens aufgerufen (angezeigt) werden soll...

    Eigentlich was richtig einfaches... aber ich bin immernoch Neuling und ich blätter mir halt die Finger schon wund, um ansatzweise in der Art etwas hinzubekommen...
    Aktuell bin ich dabei den Client zu schreiben... Die Datei wird auch schon eingelesen, Ausgabe geht auch (Label1.text), jedoch muss da halt noch einiges an Zwischenschritten rein.
    Überwachung des Verzeichnisses geht ebenfalls schon,... Mit Timer alle 3 Sekunden wird nach der Datei (export.gdt) gesucht.
    Nein! Doch! OHH!

    samson schrieb:

    Erstmal das Auslesen der Datei hinbekommen
    Zerlege Dein Problem in eine Reihe von disjunkten Teilproblemen und löse diese in je einem separaten Projekt ggf. mit Hilfe in je einem separaten Thread hier.
    Wenn Du alle Teilprobleme zu Deiner Zufriedenheit gelöst hast, führe sie in einem neuen Projekt zusammen.
    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!
    Klasse schön und gut... Hab ich auch gefunden, aber ist das hier nicht gleich geltent zu einer Klasse?

    VB.NET-Quellcode

    1. Private Sub read_gdt()
    2. Dim gdt_filename = My.Settings.gdt_filename
    3. Dim gdt_filepath = My.Settings.gdt_path
    4. myArray = System.IO.File.ReadAllLines("c:\auto_gdt\export.gdt", System.Text.Encoding.Default)
    5. label_lname.Text = myArray(7).Remove(0, 7)
    6. If myArray(7).Remove(0, 7) = "1" Then
    7. label_anrede.Text = "Herr"
    8. Else
    9. label_anrede.Text = "Frau"
    10. End If
    11. label_lname.Visible = True
    12. label_anrede.Visible = True
    13. label_zimmer.Visible = True
    14. File.Delete(My.Settings.gdt_path + My.Settings.gdt_filename)
    15. Timer2.Start()
    16. End Sub
    Nein! Doch! OHH!
    Das ist eine Sub - wieso postest du eine Sub, wennich sag "code eine Klasse"?

    Hmm - vmtl. ist zu einfach, was ich anfrage: Einfach eine leere Klasse.
    Und da hinein - wie du selbst gesagt hast - 2 Properties:
    Geschlecht, und Nachname...


    Mehr nicht

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

    Ok, an der Stelle steig ich mit meinen minimalen Kenntnissen aus... Ich bin schon am Googlen,... Aber eine Sub die ich "deklariere" read_gdt() ist meines wissens nach wie ich es aus PHP kenne gleichbedeutend einer Klasse... Das war also keine Feststellung sondern eine Frage ;)
    Nein! Doch! OHH!
    Es soll doch eine Daten-Klasse werden.
    Eine Instanz davon soll doch einen Patienten darstellen.
    Also benenn die Datei um in "Patient". Dabei fragt VS dich, ob auch die darin enthaltene Klasse umbenannt werden soll - ja, sie soll.

    Und bitte (noch) nicht blindlings iwelche Subs hineinkopieren, sondern die Properties anlegen - wie du selbst gesagt hast:

    samson schrieb:

    Geschlecht, und Nachname...