Einzelne Elemente (Zahlenwerte) einer Textdatei einlesen und Sie an externes Programm übergeben

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Einzelne Elemente (Zahlenwerte) einer Textdatei einlesen und Sie an externes Programm übergeben

    Hi!

    Ich habe eine Textdatei der folgenden Form:

    1000#blabla#blabla
    1012#blabla#blabla
    1123#durchmesser#4000
    ...
    ...

    wobei "4000" der Wert ist, den ich haben möchte. Dieser soll von VB eingelesen werden und über einen weiteren Befehl an einen deklarierten Parameter übergeben werden. In diesem Fall handelt es sich um eine Anbindung zu einem CAD-Programm. Wie ich den Parameter an das CAD-Programm übergebe, ist klar. Ich würde nur gerne den Wert aus der Textdatei dafür benutzen anstatt ihn einfach nur hinzuschreiben. Meine VB Kenntnisse sind kaum bis gar nicht vorhanden, daher wäre ich über jede Hilfe sehr dankbar
    Hey, danke schonmal für deine Hilfe. Ich hätte mich vllt. noch etwas präziser ausdrücken sollen. Ich habe in meinem Code folgende zeile

    Value = CValue.CreateDoubleParamValue(5000)

    Da wo die 5000 steht, soll der eingelesene Wert "rein" um so übergeben zu werden. Also ich will nicht, dass mir der Wert irgendwo aufpoppt :D
    Muss ich nicht noch angeben wo sich die Textdatei befindet und wie sie heißt etc.? Tut mir Leid, ich habe echt keine Ahnung davon...ich brauche nur die Logik um das umzusetzen.
    Ist dies genau ein Textbeispiel oder sieht Deine Textdatei nur so ungefähr aus?
    Probier mal dies:

    VB.NET-Quellcode

    1. Dim Lines() As String = System.IO.File.ReadAllLines(DEINE_DATEI)
    2. Dim parts() As String = Lines(2).Split("#"c)
    3. MessageBox.Show(parts(2))

    -------------------------------------
    Also ich will nicht, dass mir der Wert irgendwo aufpoppt :D

    Genau das ist Dein Part.
    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!
    @Rod
    Wenn ich deinen Code reinkopiere, dann funktioniert das leider nicht. Es kommt die Meldung, dass "lines" nicht deklariert wurde und ein")" erwartet sei. Liegt vermutlich an mir.

    @UFO
    Danke, das funktionert schonmal...allerdings möchte ich ja die Datei durchsuchen und nicht jede Zeile einzeln in meinen Code kopieren...das Textfile enthält jede Menge unnötiger Zeilen, ich möchte vllt 5% davon ansteuern und die Werte wissen...und in jeder Zeile stehen nunmal andere Zahlen vorne etc. Es werden auch häufig andere Daten sein...deshalb möchte ich eigentlich nur so eine Logik erstellen wie "gib mir immer den wert hinter durchmesser# aus". Allerdings sind die Zahlen vorne wie gesagt immer unterschiedlich und deshalb kann ich nicht nur einen Fall abarbeiten.
    Also, der Code läuft nun alle Zeilen durch.

    VB.NET-Quellcode

    1. Dim Lines As String() = IO.File.ReadAllLines("Datei.??")
    2. For Each Line As String In Lines
    3. Dim Wert As String = Line.Substring(Line.LastIndexOf("#") + 1)
    4. 'Value = CValue.CreateDoubleParamValue(Wert)
    5. Next
    Ohne Kommentar:
    Bilder
    • 4000.jpg

      20,72 kB, 789×117, 86 mal angesehen
    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!
    @Rod
    War wie gesagt mein Fehler, ich wusste nicht, dass man "..." beim Dateipfad benutzen muss

    @UFO
    Ich habe den Code mal mit meinem verknüpft und es funkioniert! Danke schonmal!
    Aber jetzt wirds langsam kompliziert. Ich habe mal etwas aus der Originaldatei kopiert, die sieht doch etwas anders aus:

    21161#0#vs##Schweißnahtfaktor, Stutzenrohr#joint efficiency, nozzle tube#
    20094#1#DIMy#300#Blockflansch#reinforcing ring#
    27336#1### ##
    20096#1#da#600#Außendurchmesser#outer diameter#
    20097#0#ss##vorh Wanddicke#actual wall thickness#
    20098#0#c1##Herstellungstoleranz#manufacturing tolerance#
    20099#0#c2##Abnutzungszuschlag#corrosion allowance#
    20100#0#ls##vorh Stutzenlänge#actual length of nozzle#
    20101#1#l's#30#innerer Überstand#protruding length#

    Hier brauche ich z.B. die 300, 600 und 30...ich würde natürlich mehrere Werte deklarieren und dann einzeln zuweisen, aber ich möchte ja die einzelnen Zeilen suche...also durchmesser etc. Da die Datei doch etwas anders aussieht, kommt das mit dem last index of auch nicht mehr hin haha. Habe wirklich keine Ahnung, sry =D
    Habs mit den Zeilen getestet, es geht :thumbsup: :

    VB.NET-Quellcode

    1. Dim Lines As String() = IO.File.ReadAllLines("Datei.txt")
    2. For Each Line As String In Lines
    3. Dim parts As String() = Line.Split("#"c)
    4. For i As Integer = 2 To parts.Length - 1 'Ja 2, da die Ersten 2 immer Zahlen sind ;-)
    5. If IsNumeric(parts(i)) Then
    6. Dim Wert As String = parts(i)
    7. 'Value = CValue.CreateDoubleParamValue(Wert)
    8. End If
    9. Next
    10. Next
    Jetzt hörts bei mir auf mit dem Verstehen haha...habs getestet und habe den Wert überführt in das CAD-Modell. Das Maß wurde zu 30 geändert. Er hat also alle Werte die geliefert wurden nacheinander eingesetzt und am Ende war es 30? Wie bekomme ich es denn dann hin, dass Wert1 parameter1 (durchmesser) ersetzt, wert2 parameter2(innerer überstand) etc? Ich hau einfach mal den gesamten Code rein.

    VB.NET-Quellcode

    1. Dim asyncConnection As IpfcAsyncConnection = Nothing
    2. Dim cAC As CCpfcAsyncConnection
    3. Dim session As IpfcBaseSession
    4. Dim workdir As String
    5. Dim window As IpfcWindow
    6. Dim descModel As IpfcModelDescriptor
    7. Dim type As EpfcModelType
    8. Dim solid As IpfcSolid
    9. Dim ParaOwner As IpfcParameterOwner
    10. Dim para As IpfcParameter = Nothing
    11. Dim CValue As New CMpfcModelItem
    12. Dim Value As IpfcParamValue
    13. Dim model As IpfcModel
    14. workdir = "C:\Users\Test" 'gegen den Pfad zum Part1.prt ersetzen
    15. cAC = New CCpfcAsyncConnection
    16. asyncConnection = cAC.Connect(Nothing, Nothing, Nothing, Nothing)
    17. session = asyncConnection.Session
    18. session.ChangeDirectory(workdir)
    19. type = EpfcModelType.EpfcMDL_PART
    20. descModel = (New CCpfcModelDescriptor).Create(type, "Part1.prt", Nothing)
    21. descModel.Path = workdir
    22. window = session.OpenFile(descModel)
    23. window.Activate()
    24. window.Activate()
    25. Dim Lines As String() = IO.File.ReadAllLines("C:\Users\test.txt")
    26. For Each Line As String In Lines
    27. Dim parts As String() = Line.Split("#"c)
    28. For i As Integer = 2 To parts.Length - 1 'Ja 2, da die Ersten immer zahlen sind ;-)
    29. If IsNumeric(parts(i)) Then
    30. Dim Wert As String = parts(i)
    31. Value = CValue.CreateDoubleParamValue(Wert)
    32. End If
    33. Next
    34. Next
    35. model = session.CurrentModel()
    36. ParaOwner = model
    37. para = ParaOwner.GetParam("PARAMETER_1")
    38. para.SetScaledValue(Value, Nothing)
    39. solid = CType(model, IpfcSolid)
    40. solid.Regenerate(Nothing)
    41. asyncConnection.Disconnect(Nothing)
    42. End
    43. End Sub
    Setz an die Stelle einen Haltepunkt und steppe Dich durch Dein Programm.
    Sieh Dir dsen Inhalt der VAriablen an und wenn Du eine Stelle gefunden hast, die sich anders verhält als Du glaubst, dass sie sich verhalten soll, hast Du einen Fehler gefunden. :thumbsup:
    Das nennt man Debuggen.
    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!
    Haha danke ;D
    Ich habe leider keine Ahnung von der Syntax, ich habe lediglich die Idee im Kopf. Ich sehe gerade, dass die ersten Zahlen der gleichen Parameter immer identisch sind.
    Also ich will einfach sowas haben wie "Gib mir immer die Zahl nach '20096#1#da#'" und weise "Wert1" dieser Zahl zu. Und so weiter für die einzelnen Parameter. Ich brauche praktisch keine Schleife, sondern einfach für jeden Wert einen Befehl, der nacheinander ausgeführt wird. Ich brauche das eigentlich nur mal für einen Wert, den Rest könnte ich dann übernehmen.
    Wenn Du 50 Zeilen hast, schreibst Du aslo 50 Befehle.
    Wenn Du morgen 250 Zeilen hast, klemmt es, Du schreibst aber 200 weitere Befehle.
    Übermorgen sind es wieder 50 Zeilen, schace, die Arbeit von gestern machen wir rückgängig.
    Junge / Mädchen, mach Dir einen Plan, wie Du das allgemeingültig löst, lerne die Grundlagen und nebenbei das Programmieren. :D
    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!
    Es sind ja aus ner 100 Zeilen Datei vllt 5 die ich brauche! Das ändert sich auch nicht großartig, sodass ich den Überblick behalten kann.
    Ich will auch nicht lernen zu programmieren, das ist nicht meine Disziplin...ich brauche das halt nur dieses eine Mal für ein kleines Problem. Ich glaube, für jemanden, der das draufhat, ist das ne Arbeit von 2 Minuten...ich konnte leider nicht absolut präzise formulieren was ich eigentlich wollte, da ich die Möglichkeiten nicht kenne.

    smoshmosh schrieb:

    Ich will auch nicht lernen zu programmieren, das ist nicht meine Disziplin.
    Dann musst Du die Werte halt von Hand reingeben.
    Wenn Du Code geschenkt haben möchtest, geh in das Unterforum Marktplatz, für ein paar Silberlinge wird sich bestimmt jemand finden...
    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!