TIA TIA HMI txt-Datei auslesen

Beiträge
31
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Zusammen,

ich möchte gerne eine .txt Datei im HMI via VB-Skript auslesen. Die Datei ist wie folgt aufgebaut:
Code:
1200 800 145
 320 240 200
2
7
0 1
1 0
1 0
2 1
2 0
1 1
2 1
1 0
7
240 160 0  160 240 90 2 0 0
240 160 0  480 240 90 2 1 0
120 160 0  760 160  0 1 1 0
240 160 0 1040 240 90 2 1 0
240 160 0  240 640  0 2 0 1
240 160 0  720 640  0 2 1 1
120 160 0 1080 640  0 1 1 1
7
240 160 0  240 160  0 2 0 0
240 160 0  160 560 90 2 0 1
240 160 0  720 160  0 2 1 0
120 160 0 1080 160  0 1 1 0
240 160 0  480 560 90 2 1 1
120 160 0  760 640  0 1 1 1
240 160 0 1040 560 90 2 1 1


Ich möchte nun jeden Wert (alle Integer) einzeln einlesen und in Variablen speichern.
Grundsätzlich funktioniert das auch schon. Dank der ausführlichen Anleitungen hier.
Zumindest wenn in jeder Zeile nur ein Wert steht. Die Formatierung der Datei ist fest und kommt von extern, daran kann ich leider nichts ändern.

Code:
Const ForReading = 1
Dim fso, f, infile

infile = "C:\test.txt"

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(infile) Then
    ShowSystemAlarm "Datei '" & infile & "' nicht gefunden."
    Exit Sub

Else
    Set f = fso.OpenTextFile(infile, ForReading, False)
   
    SmartTags("PL") = f.ReadLine
    SmartTags("PB") = f.ReadLine
    SmartTags("PH") = f.ReadLine
    SmartTags("KL") = f.ReadLine
    SmartTags("KB") = f.ReadLine
    SmartTags("KH") = f.ReadLine
    SmartTags("K") = f.ReadLine
    SmartTags("L") = f.ReadLine
    ShowSystemAlarm "Werte geladen"
    f.Close
End If

Kann mir da einer weiterhelfen? Welche Programmiersprache ist VB-Skript?

Danke!
Gruß Ole
 
Ich möchte nun jeden Wert (alle Integer) einzeln einlesen und in Variablen speichern.
Grundsätzlich funktioniert das auch schon. Dank der ausführlichen Anleitungen hier.
Zumindest wenn in jeder Zeile nur ein Wert steht. Die Formatierung der Datei ist fest und kommt von extern, daran kann ich leider nichts ändern.
Die Zeilen, die mehrere Werte enthalten, könntest Du mit SPLIT zerlegen.

Die Formatierung ist also fest. So fest, dass wirklich nicht mit irgendwelchen (zukünftigen) Abweichungen zu rechnen ist?
Dann sollte Deine Aufgabe recht klar und eindeutig sein, aber schlimmstenfalls in viel TippArbeit ausarten?
Da alle Werte INT sind, wäre es vielleicht sinnvoll, sie in ein 2-dimensionales Array zu schaufeln?
Damit könntest Du die Zeilen und Spalten leicht nachbilden. Die Elemente, die es in manchen Zeilen nicht gibt, würden dann einfach ungenutzt bleiben.
VBS ist ein "BASIC-Dialekt" von µSoft, ähnlich VB und VBA.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Generell kannst du Zeilen die mehr als einen Wert seperiert bei einem Space so einlesen.
Code:
Dim singleLine As String = Stream.ReadLine
Dim lineParts() As String() = singleLine.Split(" "c)

Einen String kannst du dann auch in INT wandeln mit:
Code:
Convert.toInt32(yourString.Text)
 
Eine eingelesene Zeile direkt bei den Leerzeichen splitten ist eher keine gute Idee, weil es in dem Dateiformat nicht wirklich Listentrennzeichen gibt, sondern ein bis mehrere Leerzeichen nacheinander haben zwei Funktionen als Listentrennzeichen und als Tabulator-Auffüllzeichen. Split() würde auch die Auffüllzeichen als Listentrennzeichen fehlinterpretieren! Man müsste vor dem Splitten ein eindeutiges Listentrennzeichen einfügen (A) oder die Auffüll-Leerzeichen entfernen (B,C,D), so daß das eine übrigbleibende Leerzeichen das eindeutige Listentrennzeichen ist:

(A) Den String von links nach rechts jedes Zeichen anschauen und jeweils das erste Leerzeichen nach einer Ziffer durch ein Trennzeichen (z.B. ';') ersetzen. Würde schon reichen, ist aber in VBS leider nur sehr umständlich mit Umkopieren machbar, da kann man mit dem selben Aufwand die Auffüll-Leerzeichen auch gleich entfernen.
(B) Den String zeichenweise in einen zweiten String kopieren und dabei Leerzeichen nicht mitkopieren, wenn das Zeichen davor ein Leerzeichen war:
Code:
myString = Trim(myString)  'Leerzeichen am Ende (und am Anfang) des String entfernen
myLen = Len(myString)
newString = ""
cBefore = " "
For i = 1 To myLen
    c = Mid(myString, i, 1)
    If c <> " " Or cBefore <> " " Then
        newString = newString & c
    End If
    cBefore = c
Next
(C) Mit Replace() alle Mehrfach-Leerzeichen durch ein einzelnes Leerzeichen ersetzen:
Code:
While InStr(1, myString, "  ") > 0
    myString = Replace(myString, "  ", " ")
Wend
(D) Mit der Kanone RegExp die Mehrfach-Leerzeichen durch ein einzelnes Leerzeichen ersetzen:
Code:
Dim regAusdr
Set regAusdr = New RegExp
regAusdr.Pattern = " +"       ' Suchmuster-Regel
regAusdr.IgnoreCase = True
regAusdr.Global = True
myString = regAusdr.Replace(myString, " ")

Danach kann man mit Split() den String zerlegen lassen. Das anschließende Entnehmen der Ziffernfolgen und Umwandeln in eine Zahl kommt mit überflüssigen Leerzeichen vor und nach den Ziffern klar, oder man kann sie vorher mit Trim() entfernen.


@NicoSch
Hier geht es um VBS, da funktioniert Dein VB-Code nicht.

Harald
 
Danach kann man mit Split() den String zerlegen lassen. Das anschließende Entnehmen der Ziffernfolgen und Umwandeln in eine Zahl kommt mit überflüssigen Leerzeichen vor und nach den Ziffern klar, oder man kann sie vorher mit Trim() entfernen.
:unsure: Danach, also nach dem Ersetzen der MehrfachLeerzeichen durch EinfachLeerzeichen, mit Spli() den String zerlegen lassen ... woher sollen dann die überflüssigen Leerzeichen vor oder nach den Ziffern kommen? Die Trennzeichen werden doch von Split() nicht in die ZielStrings übernommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:unsure: Danach, also nach dem Ersetzen der MehrfachLeerzeichen durch EinfachLeerzeichen, mit Spli() den String zerlegen lassen ... woher sollen dann die überflüssigen Leerzeichen vor oder nach den Ziffern kommen? Die Trennzeichen werden doch von Split() nicht in die ZielStrings übernommen.
Harald meint die Leerzeichen, die zur Formatierung der gleichen Spaltenbreite eingefügt werden:

Code:
240 160 0 1040 240 90 2 1 0
240 160 0  240 640  0 2 0 1
 
Danach kann man mit Split() den String zerlegen lassen. Das anschließende Entnehmen der Ziffernfolgen und Umwandeln in eine Zahl kommt mit überflüssigen Leerzeichen vor und nach den Ziffern klar, oder man kann sie vorher mit Trim() entfernen.
:unsure: Danach, also nach dem Ersetzen der MehrfachLeerzeichen durch EinfachLeerzeichen, mit Spli() den String zerlegen lassen ... woher sollen dann die überflüssigen Leerzeichen vor oder nach den Ziffern kommen? Die Trennzeichen werden doch von Split() nicht in die ZielStrings übernommen.
Gemeint ist, falls man Variante (A) angewandt hat und Mehrfach-Leerzeichen noch drin sind. Split() trennt einfach den String in Teil-Strings und entfernt dabei das Trennzeichen, entfernt aber keine Leerzeichen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gemeint ist, falls man Variante (A) angewandt hat ...
Richtig, die Variante (A) hatte ich schon nicht mehr im Kopf und auch nicht mehr auf dem Bildschirm, als ich den "Danach"-Satz las.

(A) Den String von links nach rechts jedes Zeichen anschauen und jeweils das erste Leerzeichen nach einer Ziffer durch ein Trennzeichen (z.B. ';') ersetzen. Würde schon reichen, ist aber in VBS leider nur sehr umständlich mit Umkopieren machbar, ...
Hier eine umständliche Variante von (A), aber ohne Umkopieren:
Code:
sLastChar = " "
For xPtr = 1 to Len(string)
    sChar = Mid(string, xPtr, 1)
    If sChar = " " AND sLastChar <> " " Then Mid(string, xPtr, 1) = ";"
    sLastChar = sChar
Next xPtr
 
Hier eine umständliche Variante von (A), aber ohne Umkopieren:
Code:
sLastChar = " "
For xPtr = 1 to Len(string)
    sChar = Mid(string, xPtr, 1)
    If sChar = " " AND sLastChar <> " " Then Mid(string, xPtr, 1) = ";"
    sLastChar = sChar
Next xPtr
Jaaa wenn das so einfach ginge dann hätte ich auch nicht "umständlich" geschrieben. :cool:
Das funktioniert meines Wissens nämlich nicht mit VBS - da kann man mit Mid() nur Zeichen auslesen, aber nicht in den String schreiben wie in den "richtigen" VB-Dialekten. Mit einer richtigen Programmiersprache hätte ich direkt Variante (A) programmiert, weil die am effizientesten ist.

Harald
 
Zurück
Oben