TIA VBscript Daten lesen von csv, bestimmte Zeile

Supermario73

Level-2
Beiträge
77
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
Ich möchte eigentlich was ganz einfaches tun:
Ich möchte in einem Script eine bestimmte Zeile aus dem csv File lesen und auf die Variablen schreiben. Und da klemmt es:

Alle Zeilen sind gleich (einfach mit anderen Werten, 100 Zeilen à 42 Werten).
Die Variable mit der Zeilennummer ist "SmartTags("i")".

Das heisst wenn der Inhalt der Variable SmartTags("i") = 42 ist, sollen die Werte der 42. Zeile auf die Variablen:

SmartTags("ACTUAL_RECIPE_Rezept_SetFuntion")
SmartTags("ACTUAL_RECIPE_Rezept_SetProductTempKMIX")
SmartTags("ACTUAL_RECIPE_Rezept_SetTempSensor")
usw. kopiert werden.
Ich weiss nun nicht wie ich die Variable SmartTags("i") einbinden muss damit es funktioniert.
Ich bitte um Hilfe. Besten Dank für Eure Tipps.


Code wo die Variable eingefügt werden soll:
Code:
' Werte von einer bestimmten Zeile einlesen

 MyZf = f.ReadLine
 field = Split(MyZf, ";")

 
SmartTags("ACTUAL_RECIPE_Rezept_SetFuntion") = field(0) 
SmartTags("ACTUAL_RECIPE_Rezept_SetProductTempKMIX") = field(1)
SmartTags("ACTUAL_RECIPE_Rezept_SetTempSensor") = field(2)



Ganzer Code:

Code:
Sub Read_data_from_file()
Dim fso, f, ts, field, MyZf
' Catch errors -- Fehler abfangen
On Error Resume Next
' Create file object -- Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
 ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
 Err.Clear
 Exit Sub
End If
Set f = fso.OpenTextFile(FileName, 1, 0, -2)
If Err.Number <> 0 Then
 ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
 Err.Clear
 Exit Sub
End If
 
' Werte von einer bestimmten Zeile einlesen

 MyZf = f.ReadLine
 field = Split(MyZf, ";")

 
SmartTags("ACTUAL_RECIPE_Rezept_SetFuntion") = field(0) 
SmartTags("ACTUAL_RECIPE_Rezept_SetProductTempKMIX") = field(1)
SmartTags("ACTUAL_RECIPE_Rezept_SetTempSensor") = field(2)

 
' Tidy up -- Aufraeumen
f.Close
Set f = Nothing
Set fso = Nothing
ShowSystemAlarm "Readout of the data was successful!"
End Sub
 
In einer Schleife (While..Wend oder Do While..Loop) i - 1 Zeilen einlesen, dann liefert nach der Schleife das nächste ReadLine die Zeile(i) :
Code:
i = SmartTags("i")

' i-1 Zeilen lesen
Do While i > 1
  MyZf = f.ReadLine
  i = i - 1
Loop

' Zeile(i) lesen
MyZf = f.ReadLine

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald
Besten Dank für Deine rasche Antwort.
Bin heute noch auf einer Anlage und werde es am Abend testen können. Die fertige Lösung sollte nur 1 bestimmte Zeile lesen. Das heisst ich werde den loop nicht benötigen.
Werde die fertige Lösung posten.
Bis bald.
 
Hallo,

den Loop benötigst Du unbedingt, weil es nicht möglich ist, in einer per OpenTextFile geöffneten Textdatei direkt eine bestimmte Zeile zu lesen. Es müssen vom Anfang der Datei i-1 Zeilen abgezählt eingelesen werden, damit der Datei-Lesezeiger auf der gewünschten Zeile i steht und das nächste ReadLine die gewünschte Zeile liefert.

(Nicht wirklich eine Alternative: die gesamte Datei (mit unbekannter Anzahl Zeilen!) in ein großes Array einlesen, dann kann man die Zeilen wahlfrei im Array adressieren)

Harald
 
Hallo Harald
Unglaublich wie schnell Du Antwortest. Besten Dank für Deine Hilfe. Ich werde es genau so wie Du mir geschrieben hast prüfen. Bis bald....melde mich
 
Nun habe ich folgende Lösung gefunden, welche soweit auch funktioniert:
Code zum lesen der Zeilen in ein Array
Code:
' Read values till end of file -- Werte bis zum Dateiende einlesen
Do While Not f.AtEndOfStream 
 
 MyZf = f.ReadLine
 field = Split(MyZf, ";")
  
 For i=0 To 42
  HiField(j,i) = field(i)
 Next
 j = j + 1 
Loop
x = SmartTags("i") - 1
SmartTags("ACTUAL_RECIPE_Rezept_SetFuntion") = HiField(x,0) 
SmartTags("ACTUAL_RECIPE_Rezept_SetProductTempKMIX") = HiField(x,1)
SmartTags("ACTUAL_RECIPE_Rezept_SetTempSensor") = HiField(x,2)

Das komplette Script:

Code:
Sub Read_data_from_file()
Dim fso, f, ts, field, MyZf, i , j , HiField(100,42) , x 
' Catch errors -- Fehler abfangen
On Error Resume Next
i=0
j=0
' Create file object -- Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
 ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
 Err.Clear
 Exit Sub
End If
Set f = fso.OpenTextFile(FileName, 1, 0, -2)
If Err.Number <> 0 Then
 ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
 Err.Clear
 Exit Sub
End If
'SmartTags("i")=0
' Read values till end of file -- Werte bis zum Dateiende einlesen
Do While Not f.AtEndOfStream 
 
 MyZf = f.ReadLine
 field = Split(MyZf, ";")
  
 For i=0 To 42
  HiField(j,i) = field(i)
 Next
 j = j + 1 
Loop
x = SmartTags("i") - 1
SmartTags("ACTUAL_RECIPE_Rezept_SetFuntion") = HiField(x,0) 
SmartTags("ACTUAL_RECIPE_Rezept_SetProductTempKMIX") = HiField(x,1)
SmartTags("ACTUAL_RECIPE_Rezept_SetTempSensor") = HiField(x,2)
 
' Tidy up -- Aufraeumen
f.Close
Set f = Nothing
Set fso = Nothing
ShowSystemAlarm "Readout of the data was successful!"
End Sub
 
Hat Dein Runtime-PC so extrem Langeweile ;) daß Du eine komplette csv-Datei einliest und in 4343 Werte splittest, von denen Dich eigentlich nur 3 Werte in einer einzigen Zeile interessieren, vieleicht sogar nur die ersten 3? Warum splittest Du auch alle uninteressanten Zeilen?

Für professionellen Einsatz solltest Du noch ein paar Prüfungen einbauen ("On Error Resume Next" und dann keinerlei Prüfungen ist nicht professionell):
Hat Deine csv-Datei garantiert in jeder Zeile 43 Werte stehen bzw. 42 Semikolons ";"?
Hat Deine csv-Datei garantiert höchstens 101 Zeilen?

Harald
 
Danke für die Tipps. Fehlerprüfung werde ich noch einpflegen. Nein es wird selbstverständlich die komplette Linie eingelesen (43 Werte). Nur im Test Script wurde dies mit 3 Variablen erstellt.
 
Zurück
Oben