|
| Autor |
Nachricht |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Newbie braucht Hilfe beim Einlesen von Dateien
Verfasst am: 17.03.2011, 11:57 |
|
|
Hallo,
ich bin totaler Newbie was die Programmierung angeht, möchte jetzt aber damit mal anfangen.
Und zwar möchte ich gern aus einer Datei die Settings.ini heißt bestimmte Zeilen auslesen. Die Zeilen beginnen mit
File =
und
Parameter =
ich benötige quasi das was nach dem = kommt. Die Zeilen stehen ziemlich am Ende der Datei, der ganz "mist" am Anfang interessiert mich garnicht.
Den Inhalt dieser Zeilen möchte ich in andere andere Datei schreiben, z.B. temp.txt
Ich hoffe mir kann jemand helfen und bedanke mich schonmal im Voraus.
LG
MarkOH |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 13:24 |
|
|
Also, was du vorhast ist garnicht so schwierig, eine Datei komplett auslesen kannst du so:
| Code: |
'Wir deklarieren uns erstmal ein paar Variablen
Dim Setting1 As String
Dim Setting2 As String
Dim fs As IO.FileStream = New IO.FileStream( _
"Settings.ini", IO.FileMode.Open, _
IO.FileAccess.Read)
Dim w As IO.StreamReader = New IO.StreamReader(fs)
Dim Var1 As String = w.ReadToEnd 'Die Datei komplett einlesen
'Wenn das fertig ist, den Filestream und den reader wieder schließen
w.Close()
fs.Close()
|
Jetzt müssen wir nach deinen Zeilen suchen:
| Code: |
'Wir erstellen ein Array aus allen Zeilen, indem wir den String an jeder neuen Zeile splitten
Dim loadarray As Array = Var1.Split(New String() {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
'Jetzt müssen wir jede Zeile durchgehen:
Dim temp As String
For Each temp In loadarray 'Eine Schleife, die jedes Elemet im Array durchgeht
If temp.Remove(5, temp.Length) = "File =" Then 'Wenn die 5 ersten Zeichen der ausgelesenen Zeile deinen Suchbegriff ergeben dann:
Setting1 = temp.Remove(0, Var1.LastIndexOf("=") + 1) ' Entfernen wir alles bis einschließlich dem = und übergeben den Wert Setting1
End If
'das gleiche nochmal für deinen zweiten Wert
If temp.Remove(10, temp.Length) = "Parameter =" Then
Setting2 = temp.Remove(0, Var1.LastIndexOf("=") + 1)
End If
Next
|
So jetzt müssen wir die Variablen nur noch in eine neue Datei schreiben:
| Code: |
Dim ws As FileStream = New FileStream( _
"temp.txt", FileMode.OpenOrCreate, _
FileAccess.Write)
' --- Stream öffnen
Dim wr As StreamWriter = New StreamWriter(ws)
wr.WriteLine(Setting1) 'schreibt die erste zeile
wr.WriteLine(Setting2) 'schreibt die zweite Zeile
'...
'Dann wieder Stream und Reader schließen
wr.Close()
ws.Close()
End Sub
|
So hab jetzt alles frei Schnauze hier so reingeschrieben, hoffe aber, dass ich keine Fehler gemacht hab 
Zuletzt bearbeitet von Tyrannmisu am 17.03.2011, 14:12, insgesamt 2-mal bearbeitet |
|
| |
|
 |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Verfasst am: 17.03.2011, 14:08 |
|
|
Hallo Tyran,
erstmal danke für die schnelle Hilfe aber scheinbar sind 2 Fehler drin
"length" ist kein Member von "String"
"Var1LastIndexOf" wurde nicht deklariert.
Wo und was muss ändern?
LG MarkOH |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 14:14 |
|
|
| markoh hat Folgendes geschrieben: | Hallo Tyran,
erstmal danke für die schnelle Hilfe aber scheinbar sind 2 Fehler drin
"length" ist kein Member von "String"
"Var1LastIndexOf" wurde nicht deklariert.
Wo und was muss ändern?
LG MarkOH |
Sry da waren ein paar Tippfehler drinn, habs nochmal editiert kannst es wieder versuchen.
Achso und du musst, um Dateien einlesen zu können erst noch die Methode importieren, also diese Zeile noch vor
"Public Class..." einfügen
| Code: |
Imports System.IO.File
|
|
|
| |
|
 |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Verfasst am: 17.03.2011, 14:28 |
|
|
Funktioniert leider noch nicht
Ich gebe dir mal den Inhalt der Settings.ini von dem Bereich der für mich interessant ist:
[File1]
File = WindowsXP-KB2479943-x86-DEU.exe
Parameters = /quiet /norestart
Name = MS11-015: Sicherheitsanfälligkeiten in Windows Media Runtime können Remotecodeausführung ermöglichen
Link = http://support.microsoft.com/?scid=kb;de;KB2510030
Logfile = KB2510030.log
Restart =
[File2]
File = WindowsXP-KB2483618-x86-DEU.exe
Parameters = /quiet /norestart
Name = MS11-017: Sicherheitsanfälligkeit in Remotedesktopclient kann Remotecodeausführung ermöglichen
Link = http://support.microsoft.com/?scid=kb;de;KB2508062
Logfile = KB2508062.log
Restart =
[File3]
File = WindowsXP-KB2481109-x86-DEU.exe
Parameters = /quiet /norestart
Name = MS11-017: Sicherheitsanfälligkeit in Remotedesktopclient kann Remotecodeausführung ermöglichen
Link = http://support.microsoft.com/?scid=kb;de;KB2481109
Logfile = KB2481109.log
Restart =
[File4]
File = WindowsXP-KB2483614-x86-DEU.exe
Parameters = /quiet /norestart
Name = MS11-017: Sicherheitsanfälligkeit in Remotedesktopclient kann Remotecodeausführung ermöglichen
Link = http://support.microsoft.com/?scid=kb;de;KB2483614
Logfile = KB2483614.log
Restart =
Beim ausführen des Programms bekomm ich ein ArgumentOutOfRangeException und zwar hier
| Code: | | If temp.Remove(5, temp.Length) = "File =" Then |
ich nehme an an der Zeile mit Parameter wird das Problem dann nochmal auftreten.
Den Import der Methode hatte ich schon drin. |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 14:36 |
|
|
| markoh hat Folgendes geschrieben: |
Beim ausführen des Programms bekomm ich ein ArgumentOutOfRangeException und zwar hier
| Code: | | If temp.Remove(5, temp.Length) = "File =" Then |
ich nehme an an der Zeile mit Parameter wird das Problem dann nochmal auftreten.
Den Import der Methode hatte ich schon drin. |
Ja genau sowas passiert mir immer wenn ich was frei Schnauze schreibe
Der remove Aufruf ist ja Nullbasieren, die Zählung fängt also so an :0,1,2,3,...
Bei Length wiederum nicht, also siehts so aus: 1,2,3,...
Musst also in beiden Zeilen den Code so ändern:
| Code: | | If temp.Remove(5, temp.Length-1) = "File =" Then |
Aber so wie es jetzt ist werden natürlich nur die Werte von File4 in die neue Datei geschrieben, kannst aber das Schreiben der Datei gleich in die Suchschleife mit reinpacken dann schreibt er es jedesmal wenn er den entsprechenden Begriff findet.
Oder das schreiben in einen eigenen Sub und ihn dann in der Suchschleife aufrufen und als Parameter den zu schreibenen Wert übergeben. |
|
| |
|
 |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Verfasst am: 17.03.2011, 14:42 |
|
|
Sorry der Fehler ist immernoch da  |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 14:48 |
|
|
| markoh hat Folgendes geschrieben: | Sorry der Fehler ist immernoch da  |
Mh ich werde es gleich selbst nochmal testen, muss vorher etwas anderes machen, hab also kurz Geduld  |
|
| |
|
 |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Verfasst am: 17.03.2011, 14:50 |
|
|
Kein Ding, lass dir Zeit, wenns nicht heute wird, auch nicht schlimm, das Ziel ist der Weg  |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 15:25 |
|
|
So Entschuldigung nochmal hab da vorhin ein wenig Unsinn verzapft und zu wenig nachgedacht
Hier nun der Codeteil Fehlerfrei:
| Code: |
For Each temp In loadarray 'Eine Schleife, die jedes Elemet im Array durchgeht
If temp.Length > 6 Then
If temp.Remove(6, (temp.Length - 6)) = "File =" Then 'Wenn die 5 ersten Zeichen der ausgelesenen Zeile deinen Suchbegriff ergeben dann:
Setting1 = temp.Remove(0, temp.LastIndexOf("=") + 1) ' Entfernen wir alles bis einschließlich dem = und übergeben den Wert Setting1
End If
End If
If temp.Length > 12 Then
'das gleiche nochmal für deinen zweiten Wert
If temp.Remove(12, (temp.Length - 12)) = "Parameters =" Then
Setting2 = temp.Remove(0, temp.LastIndexOf("=") + 1)
End If
End If
Next |
Erst mal sind jetzt noch Abfragen da, welche überprüfen ob der Code die mindestlänge hat bevor wir darann rumschnipseln, dann muss man beim remove natürlich bedenken, dass wenn wir von Zeichen 6 anfangen man auch die Gesamtlänge -6 nehmen muss und nicht -1 um alles ab zeichen 6 zu löschen.
Außerdem hatte ich vergessen Var1 durch temp zu ersetzten, nachdem ich den Code das erste mal umgeschrieben hab.
Kommt davon wenn man versucht etwas nebenbei zu machen wenn man selber grad an was anderem programmiert
wie gesagt jetzt werden nur die letzten beiden Vorkommen deiner Suche geschrieben, aber versuchs erst mal selber so umzubauen, dass er alle schreibt. Wenns nicht klappt melde dich nochmal, ist eig ganz einfach. |
|
| |
|
 |
markoh Newbie

Anmeldedatum: 17.03.2011 Beiträge: 6
|
Verfasst am: 17.03.2011, 15:45 |
|
|
Wenn das Script erstmal so läuft, werde ich dann mal versuchen es in die Schleife einzuarbeiten, dass alle File behandelt werden, aber erstmal muss das Script laufen.
Leider tut es das noch nicht, habe hier noch einen Fehler bekommen:
| Code: | | If temp.Length > 12 Then |
Den ersten Teil macht er mit der File,aber den Bereich Parameter mag er nicht, da gibts ein NullReferenzException |
|
| |
|
 |
Tyrannmisu Newbie

Anmeldedatum: 17.03.2011 Beiträge: 8
|
Verfasst am: 17.03.2011, 15:56 |
|
|
Also ich hab den Code grade nochmal 1 zu 1 wie ich ihn hier gepostet hab bei mir reinkopiert und er läuft ohne Fehler durch...
Ich kann dir ja nochmal alles komplett posten, so gehts jedenfalls bei mir:
| Code: |
Dim fs As IO.FileStream = New IO.FileStream( _
"Settings.ini", IO.FileMode.Open, _
IO.FileAccess.Read)
Dim w As IO.StreamReader = New IO.StreamReader(fs)
Dim Var1 As String = w.ReadToEnd 'Die Datei komplett einlesen
'Wenn das fertig ist, den Filestream und den reader wieder schließen
w.Close()
fs.Close()
'Wir erstellen ein Array aus allen Zeilen, indem wir den String an jeder neuen Zeile splitten
Dim loadarray As Array = Var1.Split(New String() {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
Dim temp As String
'Jetzt müssen wir jede Zeile durchgehen:
For Each temp In loadarray 'Eine Schleife, die jedes Elemet im Array durchgeht
If temp.Length > 6 Then
If temp.Remove(6, (temp.Length - 6)) = "File =" Then 'Wenn die 5 ersten Zeichen der ausgelesenen Zeile deinen Suchbegriff ergeben dann:
Setting1 = temp.Remove(0, temp.LastIndexOf("=") + 1) ' Entfernen wir alles bis einschließlich dem = und übergeben den Wert Setting1
End If
End If
If temp.Length > 12 Then
'das gleiche nochmal für deinen zweiten Wert
If temp.Remove(12, (temp.Length - 12)) = "Parameters =" Then
Setting2 = temp.Remove(0, temp.LastIndexOf("=") + 1)
End If
End If
Next
Dim ws As FileStream = New FileStream( _
"temp.txt", FileMode.OpenOrCreate, _
FileAccess.Write)
' --- Stream öffnen
Dim wr As StreamWriter = New StreamWriter(ws)
wr.WriteLine(Setting1) 'schreibt die erste zeile
wr.WriteLine(Setting2) 'schreibt die zweite Zeile
'...
'Dann wieder Stream und Reader schließen
wr.Close()
ws.Close()
End Sub
|
Zum Testen hab ich in die Settings.ini das geschrieben, was du mir weiter oben gepostet hattest und er erstellt mir auch jedesmal brav die temp.txt mit den letzten 2 Werten.
Ich habe das jetzt durch einen Button auslösen lassen und die beiden Variablen global deklariert, also
| Code: |
Dim Setting1 As String
Dim Setting2 As String |
direkt nach
|
|
| |
|
 |
|
|