Mit dynamischer txt-Datei Programm parametrieren.

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Krumnix.

    Mit dynamischer txt-Datei Programm parametrieren.

    Hallo.

    Ich würde gerne mein Programm parametrierbar von Außen über eine txt-Datei machen.

    Das ganze hab ich soweit schon hinbekommen. Also kein Problem.

    Jetzt würde ich gerne den nächsten Schritt gehen, und eine txt-Datei erstellen, die sich

    im Umfang ändert.

    Grund ist, das ich ein Tool am programmieren bin, das bestimmte Bereiche in einer Datei

    durch andere ersetzt. Sowas wie suchen/finden/ersetzen in Dateien.

    Nun werden aber öfters bestimmte neue Dinge dazukommen, sodas ich neue Auswahlmöglichkeiten

    bis jetzt immer von Hand nachprogrammieren musste.

    Beispiel: Ersetzt werden soll eine bestimmte Zeichenfolgenart. Diese Art hat einen Grundkopf und

    danach kommen dann 200-500 verschiedenen weiter Möglichkeiten.

    "BBR-xxxxxxxx" = Zeichenart 1

    "HJH-xxxxxxxx" = Zeichenart 2

    etc.

    Für jede Zeichenart habe ich einen "Übersetzungsdatei" hinterlegt, in der die jeweiligen Zuweisungen

    stehen.

    Nun kommen aber ab und an neue Zeichenarten dazu und ich muss somit immer wieder mein Programm

    anfassen und ihm sagen, wenn der Kopf kommt, schau in der Datei nach.



    Mein Ziel ist aber, das ich mit dieser txt-Datei sagen kann, Kopf A = Zeichenart 1 = Datei blabla.csv

    Kopf B = Zeichenart 2 = Datei blublu.csv etc.

    Jedoch vergrößert sich die Datei ja und ich weiß imo nicht, wie ich es bewerkstelligen kann, das ich

    1. weiß, wieviel Konfigurationen es in der Datei gibt

    2. in meinem Programm das ganze dann so aufbaue, das wenn eine neue Zeichenart dazukommen,

    diese dann auch erkannt und abgearbeitet werden kann.?

    3. Hab ich im Moment das ganze mit einer Case-Anweisung gemacht, um den Kopf zu unterscheiden und

    die dazugehörige Datei zu laden. Was kann ich da nun machen, damit diese "dynamisch" wird?



    Bissel viele Fragen und sicher nicht so einfach zu verstehn, aber vielleicht weiß einer Rat ;)



    Danke
    Nun, Du kannst eine Config-Datei anlegen, wobei Kopf und DateiName durch einen Delimiter getrennt sind, z.B. "|". Dann lautet Deine Config.txt Datei so aus:

    Quellcode

    1. BBR- | BBR.Header.txt
    2. HJR- | HJR.Header.txt
    3. ....

    Diese Kombinationen (Kopf,Dateiname) würde ich je nach Deiner internen Verarbeitung entweder in eine Liste oder ein Dictionary eintragen und später in deinem Suchalgorithmus durchlaufen.
    Code für das Einlesen der Config-Datei könnte dann ungefähr so aussehen:

    VB.NET-Quellcode

    1. ' Steuerungs-Datei einlesen KOPF | dateiname
    2. Dim path As String = "D:\Config.txt"
    3. Dim sr As New StreamReader(path)
    4. While (sr.Peek() <> -1)
    5. Dim line = sr.ReadLine()
    6. ' Zeile in Kopf, Dateiname aufspalten
    7. Dim pair() = line.Split("|"c)
    8. Dim Kopf As String = pair(0).Trim
    9. Dim dateiName As String = pair(1).Trim
    10. ' an eine interne Liste oder directory zuweisen
    11. '...
    12. End While
    13. sr.Close()

    wobei noch eine Fehlerbehandlung mit Try..Catch.. End Try fehlt, falls Du Dich bei der Eingabe vertippt hast.

    Natürlich kannst Du auch gleich alle Kenn-Strings (BJR-xxxx) mit den zugehörigen Ersatzstrings ("BLUB-yyyy ) einlesen.

    Oder Du arbeitest Dich in Regex ein und arbeitest damit, Lösungen gibt es zu viele wenn man nichts Nähreres weiss.
    Das sieht schonmal gut aus.

    Leider habe ich ein Problem, das die Funktion beim 2. Aufruf irgendwie nicht mehr funktioniert.

    Also ich starte einen Durchlauf und mein Programm bleibt aktiv.

    Beim 2. Durchlauf liest er leider nicht mehr richtig aus.

    Hier mal mein Code, der eigentlich Deiner mehr ist ;)



    VB.NET-Quellcode

    1. Function Typ_Definieren(ByVal Zeichenart As String) As String
    2. Dim path As String = Application.StartupPath + "\einstellungen.dfs"
    3. Dim sr As New StreamReader(path)
    4. Dim Test_Var As String = LSet(Zeichenart , 4)
    5. While (sr.Peek() <> -1)
    6. Dim line = sr.ReadLine()
    7. Dim pair() = line.Split(";"c)
    8. Dim Kopf_Einstellung As String = pair(0).Trim
    9. Dim Art_Einstellung As String = pair(1).Trim
    10. If Test_Var = Kopf_Einstellung Then
    11. Return Art_Einstellung
    12. Exit While
    13. Else
    14. Return ""
    15. End If
    16. End While
    17. sr.Close()
    18. End Function

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

    Krumnix schrieb:

    Beim 2. Durchlauf liest er leider nicht mehr richtig aus.

    Nun, es sind bei Dir noch 2 Fehler in dem Code den Du beschrieben hast:
    - Du durchläufst die Datei nicht vollständig, sondern nur die erste Zeile, dann gehst Du entweder mit "Return" oder "Exit While" raus
    - wenn Du mit Return die Funktion verlässt wird der Streamreader nicht geschlossen.

    Ich hatte Dir aber auch vorgeschlagen die Konfigurationsdatei nur 1x in eine Collection oder ein Dictionary einzulesen. Wenn Du immer nur eine bestimmte Kennung abprüfen willst ob sie in Deiner Konfiguration existiert, dann ist ein Dictionary (of string,string) ideal dafür:

    VB.NET-Quellcode

    1. ' Deklaration
    2. Dim dict As New Dictionary(Of String, String)
    3. ...
    4. ' Füllen in der Schleife aus der Config.Datei
    5. dict.add(Kopf,dateiname)
    6. ...
    7. ' Abfrage
    8. If dict.ContainsKey(Kennung) Then dateiname = dict(Kennung)

    Ich hoffe Du steigst da durch: das Dictionary arbeitet ähnlich wie eine einfache Datenbank mit (Key,value) Paaren