Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Variablen mit Visual Basic aus Textdatei auslesen

Frage Entwicklung Visual Studio

Mitglied: 26705

26705 (Level 1)

13.11.2007, aktualisiert 18.11.2007, 8897 Aufrufe, 9 Kommentare

Hallo Leute,
ich habe ein VB-Problem beim Auslesen von großen Textdateien.

Diese Textdateien sind wie folgt aufgebaut:

Datensatz_eins
Variable_1 Wert_1
...
Variable_5 Wert_5
Variable_6 Wert_will_haben_1
Variable_7 Wert_7
Variable_6 Wert_will_haben_2
Variable_8 Wert_9
Variable_6 Wert_will_haben_3
Variable_9 Wert_11
Datensatz_zwei
Variable_1 Wert_12
...
Variable_5 Wert_16
Variable_6 Wert_will_haben_2
Variable_7 Wert_18
Variable_6 Wert_will_haben_3
Variable_8 Wert_20
Variable_6 Wert_will_haben_4
Variable_9 Wert_22
Datensatz_drei...usw...


Diese Textdateien haben mehrere Tausen Zeilen und ich möchte nur die Werte einiger weniger Variablen auslesen und je Datensatz eine Zeile in eine .csv-Datei schreiben.
Es sollen auch die Werte einer Variablen jeweils nur in eine Spalte geschrieben werden, das klappt auch, sieht dann ungefähr so aus:

Datensatz Variable_1 Variable_5 ...
Datensatz_eins Wert_1 Wert_5 ...
Datensatz_zwei Wert_12 Wert_16 ...

Alle Variablen sind vom Typ String und bis auf meine Problemvariable (hier mal "Variable_6" genannt) kommen sie je Datensatz nur ein Mal vor.

Das ganze frage ich mit einigen If-Anweisungen innerhalb einer Do-While-Schleife ab, die meine .csv-Datei jeweils um eine Spalte (Wert, ";") bzw. bei einem neuen Datensatz um eine Zeile ergänzen.

01.
        Do While (lineInput <> Nothing) 
02.
 
03.
            If lineInput.StartsWith(Datensatz) Then 
04.
                sw.Write(CrLf & (lineInput.Substring(21, 19) & ";"))  
05.
                lineInput = sr.ReadLine() 
06.
            End If 
07.
            If InStr(lineInput, Variable_1) Then 
08.
                sw.Write(SplitArray(lineInput, " ", 1) & ";") 
09.
                lineInput = sr.ReadLine() 
10.
            End If 
11.
usw.
Hier ist das Problem:
Die Probleme bereitet mir nun Variable_6. Sie kommt innerhalb eines Datensatzes 0-4 mal mit verschiedenen Werten vor.
Insgesamt kann sie ca. 20 verschiedene Werte je Textdatei annehmen.
Nun ist es ja keine Problem sie einfach auszulesen: "Guck nach, ist sie da, hat sie nen Wert, wenn ja füg den Wert in die Zeile ein".

Allerdings sollen die Werte dieser Variablen nach Spalten sortiert werden. d.h. gleiche Werte sollen untereinander stehen.
Wenn kein Wert vorhanden ist soll das Feld leer bleiben, so ungefähr:

Datensatz ... Variable_6 Variable_6 Variable_6 Variable_6
Datensatz_eins ... Wert_1 Wert_5
Datensatz_zwei ... Wert_5 Wert_7 Wert_8
Datensatz_drei ... Wert_1 Wert_7 Wert_8
Datensatz_vier ... Wert_8

Das sollte doch eigentlich über Arrays machbar sein. Mir fehlt da wahrscheinlich noch ne Menge Erfahrung, aber ich komme im Moment einfach nicht weiter.

Ich hoffe, dass ich meine Sorgen verständlich formuliert habe und bin für jede Idee dankbar.

Gruß,
Seppel
Mitglied: bastla
13.11.2007 um 15:26 Uhr
Hallo SeppelCeh!

Da Du nicht angeführt hast, welcher Art die Werte "Wert_1", ... sind, ganz allgemein (und total ungetestet): Zunächst vorweg ein Array für alle möglichen Werte erstellen mit
01.
arrCheck = Array("Wert_1", "Wert_2", ..., "Wert_n")
Nachdem Du in der Einlese-Schleife den Wert für "Variable_6" gefunden hast (strGelesenerWert), in einer weiteren Schleife den Index suchen:
01.
intIndex = -1 
02.
For i = 0 To UBound(arrCheck) 
03.
	If strGelesenerWert = arrCheck(i) Then 
04.
		intIndex = i 
05.
		Exit For 
06.
	End If 
07.
Next 
08.
If intIndex = -1 Then 'Nicht gefunden - weitere Vorgangsweise selbst festlegen 
09.
strExtraDelims = String(intIndex, ";")
Mit der String-Funktion wird eine entsprechende Anzahl zusätzlicher Trennzeichen (im Beispiel ";", schöner natürlich als Variable) erzeugt, welche bei der Ausgabe der Ergebniszeile dann etwa so verwendet werden können:
01.
objCSVFile.WriteLine strDatensatz & ";" & strWasWeissIch & ";" & strExtraDelims & strGelesenerWert
Grüße
bastla

[Edit] Dieses "set" stand vorhin unsinnigerweise noch oben in der ersten Code-Zeile - dafür fehlte aber "Array(" ... [/Edit]
Bitte warten ..
Mitglied: 26705
13.11.2007 um 16:43 Uhr
Moin bastla,

besten Dank schon mal. Das ";" hab ich schon mal durch ne Variable ersetzt. ^^

Die Variablen sind alle vom Typ "String" (hab ich oben im Text auch kursiv ergänzt).

Wenn ich Deinen Code richtig verstehe setzt er vor den Wert der Variable die Trenner entsprechend dem Index im Array. Wenn ich jetzt aber in einem Datensatz Für Variable_6 z.B. "Wert_1" und "Wert_8" finde würde er mir doch zu viele Trenner einsetzen.

btw. Ich schreibe momentan nicht die komplette Zeile, ich hänge immer nur den gefundenen Wert hinten dran, die neue Zeile beginne ich mit nem neuen Datensatz.
Vielleicht sollte ich die Konstruktion mal generell überdenken?!

Werde aber mit Deinem Tipp weiter probieren.

Gruß,
Seppel
Bitte warten ..
Mitglied: bastla
13.11.2007 um 18:09 Uhr
Hallo SeppelCeh!

Sorry - war vorhin leider auf der Flucht und mit einem Bein sowie dem Großteil der grauen Zellen schon aus der Tür ... Deshalb habe ich auch nicht darauf geachtet, dass mehrere Werte je Datensatz vorkommen können.

Die folgende Variante sollte jetzt aber eher passen:
01.
strDelim = ";" 
02.
 
03.
arrCheck = Array("Wert_1", "Wert_2", "Wert_3", "Wert_4", "Wert_5", "Wert_6", "Wert_7") 
04.
M = UBound(arrCheck) 
05.
Dim arrFields() 
06.
 
07.
'Do Until objTextFile.AtEndOfStream 
08.
'... 
09.
'... 
10.
'... 
11.
	Redim arrFields(M) 
12.
	'Alle für "Variable_6" gefundenen Werte behandeln ... 
13.
	For Each strEingelesenerWert In Array("Wert_3", "Wert_7", "Wert_9", "Wert_1") 
14.
		blnFound = False 
15.
		For i = 0 To M 
16.
			If strEingelesenerWert = arrCheck(i) Then 
17.
				arrFields(i) = arrCheck(i) 
18.
				blnFound = True 
19.
				Exit For 
20.
			End If 
21.
		Next 
22.
		If Not blnFound Then 
23.
			MsgBox strEingelesenerWert & " noch nicht vorhanden!", vbCritical 
24.
			'... 
25.
			'... 
26.
		End If 
27.
	Next 
28.
	strVariable_6 = Join(arrFields, strDelim) 
29.
	MsgBox strVariable_6 
30.
	'... 
31.
	'... 
32.
'Loop
Zum Testen (der Code soll stand-alone lauffähig sein) simuliere ich die Inhalte der Variablen "strEingelesenerWert" (welche Du aus dem zuletzt gelesenen Datensatz erhältst) durch ein Array mit Beispieldaten (inkl einem nicht vorgesehen Wert). Auch die Schleife zum Einlesen selbst ist nur angedeutet.

Nachdem alle Werte des aktuellen Datensatzes durchlaufen sind, wird in "strVariable_6" ein String gebildet, den Du einfach wie ein einzelnes Feld an den bereits erstellten Teil des neuen Datensatzes anhängen kannst.

Mit dem "ReDim" werden die Einträge des "arrFields" für die Behandlung des nächsten eingelesenen Datensatzes dann wieder vorweg gelöscht.
Inwieweit die ganze Struktur sinnvoll ist, musst Du natürlich selbst abschätzen - Tastsache ist jedenfalls, dass jeder der Werte ("Wert_1" etc) nur einmal auftreten darf - mehrfache Vorkommen lassen sich im Ergebnis nicht darstellen. Dies wäre nur möglich, wenn Du im Ergebnis-Datensatz die Häufigkeiten angibst, was dann etwa so aussehen würde:

Datensatz ... Wert_1 Wert_2 ... Wert_n
Datensatz_eins ... 0 2 ... 0
Datensatz_zwei ... 1 1 ... 0
Datensatz_drei ... 0 0 ... 3
Datensatz_vier ... 2 0 ... 1

Grüße
bastla
Bitte warten ..
Mitglied: 26705
13.11.2007 um 18:18 Uhr
Moin!

Ja, leider ist es sinnvoll. Wir brauchen aus diesen Dateien zu jedem Datensatz bestimmte Werte.
Da diese Dateien eigentlich zeilenweise ausgelesen und von den Maschinen verarbeitet werden, kommen einige wenige Variablen je Datensatz mehrfach mit unterschiedlichen Werten vor, und genau diese Werte von dieser einen Variable brauche ich.

Aber vielen Dank, ich werde den Code nachher oder morgen früh mal entsprechend anpassen und ausprobieren. Ich gebe auf jeden Fall ne Rückmeldung.

Gruß,
Seppel
Bitte warten ..
Mitglied: 26705
15.11.2007 um 10:43 Uhr
Moin bastla.

So, nach einigen Störungen und Problemen hab ich jetzt mal den Code angepasst und in mein Programm eingebaut.

Erstmal: Es funktioniert, die ausgelesenen Werte "strEingelesenerWert" von "Variable_6" werden in das neue Array "arrFields" geschrieben, mit den vordefinierten Werten aus "arrCheck" verglichen und an die dort definierte Position gesetzt.

Dafür schon mal vielen Dank!!!

Der einzige Haken an der Sache: er überschreibt die Werte beim Vergleich in "arrFields" gefundenen Werte korrekt, löscht aber die Stellen, die eigentlich nach dem Vergleich leer sein sollten nicht. (Im Beispiel unten sind das die Werte an den Stellen 2 und 4)
Was ich damit meine:

Ist von "arrFields" vor Vergleich:
... Stelle_1 Stelle_2 Stelle_3 Stelle_4 Stelle_5 Stelle_6 Stelle_7
... Wert_1 Wert_3 Wert_6 Wert_7

Ist von "arrFields" nach Vergleich:
... Stelle_1 Stelle_2 Stelle_3 Stelle_4 Stelle_5 Stelle_6 Stelle_7
... Wert_1 Wert_3 Wert_3 Wert_7 Wert_6 Wert_7

Soll von "arrFields" nach Vergleich:
... Stelle_1 Stelle_2 Stelle_3 Stelle_4 Stelle_5 Stelle_6 Stelle_7
... Wert_1 Wert_3 Wert_6 Wert_7

Hast Du noch eine Idee, wie ich die überflüssigen Werte aus "arrFields" löschen kann?
Ich probiere auf jeden Fall noch weiter. Will es schließlich auch mal lernen und nicht immer nur andere Fragen müssen. ^^

Gruß,
Seppel
Bitte warten ..
Mitglied: bastla
15.11.2007 um 10:56 Uhr
Hallo SeppelCeh!

Für das Löschen wäre eigentlich das "Redim arrFields(M)" zuständig - dieses muss natürlich so platziert sein, dass es vor der Bearbeitung jedes einzelnen Datensatzes (= unmittelbar vor der Schleife für alle "Variable_6"-Werte) ausgeführt wird.

Unelegant wäre die Alternative, in einer eigenen Schleife der Art
01.
For i = 0 To UBound(arrFields) 
02.
	arrFields(i) = "" 
03.
Next
die Feldinhalte zu löschen.

Grüße
bastla
Bitte warten ..
Mitglied: 26705
15.11.2007 um 13:08 Uhr
Moin bastla.

Das Löschen mit ReDim funktioniert, hab mit der Erkennung eines neuen Datensatzes verknüpft.
Sobald die Kennzeichen für nen neuen Datensatz gefunden werden wird das Array geleert.

Die ausgegebenen Werte je Datensatz sind auch korrekt, das Array wird also an der richtigen Stelle gelöscht.

Die beiden IST-Tabellen hab ich mir direkt an der "For-Each"-Schleife ausgeben lassen.

Die "Ist-Tabelle vor Vergleich" wird ausgegeben, nachdem die Werte in "arrFields" abgelegt wurden,
die "Ist-Tabelle nach Vergleich" ist die Ausgabe nach der Zeile:
01.
If strEingelesenerWert = arrCheck(i) Then 
02.
				arrFields(i) = arrCheck(i)
Nach diesem Vergleich muss ich anscheinend noch einmal Vergleichen.
Diesmal aber nicht wegen der Positionierung der Werte innerhalb "arrFields", sondern dann muss es ein Vergleich sein, bei dem in beiden Arrays an gleicher Stelle nach gleichen Werten gesucht werden und die nicht identischen Werte in "arrFields" müssen dann gelöscht werden.

Jetzt iszt aber erstmal Sicherheitsprüfung bei uns. Mein Rechner wird auf Strmlecks getestet. ^^

Bis später,
Seppel
Bitte warten ..
Mitglied: 26705
15.11.2007 um 16:36 Uhr
Ich habe die Lösung gefunden, nur leider muss ich jetzt los.
Werde sie nachher kurz beschreiben.

Gruß,
Seppel
Bitte warten ..
Mitglied: 26705
18.11.2007 um 18:05 Uhr
Hier die Lösung für mein Problem mit den doppelten Werten:

Direkt vor dem Schreiben in die Datei vergleiche ich die beiden Arrays erneut
und ersetze alle ungleichen Felder durch nichts. Also "".

01.
For i = 0 To M 
02.
        StrComp(arrFields(i), arrCheck(i)) 
03.
        If arrFields(i) <> arrCheck(i) Then 
04.
        arrFields(i) = "" 
05.
        End If 
06.
Next
Jetzt klappt es und der Beitrag ist gelöst.
Besten Dank auch,
Seppel
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Visual Studio
gelöst Pastebin auslesen mit Visual Basic? (2)

Frage von UltraZz zum Thema Visual Studio ...

Visual Studio
gelöst Remotedienst prüfen mit Visual Basic (1)

Frage von flyingmichael zum Thema Visual Studio ...

Visual Studio
Mit Visual Basic auf Shopware 5 API zugreifen (9)

Frage von SmogKiel zum Thema Visual Studio ...

Basic
gelöst Mit Visual Basic Batch Datei öffnen (26)

Frage von Flodsche zum Thema Basic ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...