Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: 26705

26705 (Level 1)

13.11.2007, aktualisiert 18.11.2007, 9209 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 ..
Ähnliche Inhalte
Visual Studio
Visual basic - Fenstergröße
gelöst Frage von Cougar77Visual Studio4 Kommentare

Hallo, ich habe ein kleines Programm geschrieben - visual studio 2015, visual basic. Soweit funktioniert das auch sehr gut, ...

Visual Studio
Visual Basic für anfänger
gelöst Frage von Daoudi1973Visual Studio12 Kommentare

ich möchte Visual Basic lernen, kann jemand mir Tipps geben. PS: ich habe nur im 1999 mit Fortran 90 ...

VB for Applications
Visual Basic Checkbox drucken?
gelöst Frage von GERz0cKErZVB for Applications10 Kommentare

Hallo, ich habe ein Programm wo man mehrere checkboxen anklicken kann. Der Text der checkboxen soll am Ende gedruckt ...

Visual Studio
Bewegtes Label Visual Basic
gelöst Frage von Cougar77Visual Studio1 Kommentar

Guten Abend, ich versuche mich grade ein bisschen an VB. An sich würde ich gerne ein beliebiges Element (Label, ...

Neue Wissensbeiträge
Internet

Kommentar: Bundesregierung erwägt Ausschluss von Huawei im 5G-Netz - Unsere Presse wird immer sensationsgieriger

Information von Frank vor 1 TagInternet5 Kommentare

Hier mal wieder ein schönes Beispiel für fehlgeleiteten Journalismus und Politik zugleich. Da werden aus Gerüchten plötzlich Fakten, da ...

Windows 10

Netzwerk-Bug in allen Windows 10-Versionen durch Januar 2019-Updates

Information von kgborn vor 1 TagWindows 101 Kommentar

Nur ein kurzer Hinweis für Admins, die Windows 10-Clients im Portfolio haben. Mit den Updates vom 8. Januar 2019 ...

Windows 10

Windows 10 V1809: Rollout ist gestartet - kommt per Windows Update

Information von kgborn vor 2 TagenWindows 102 Kommentare

Eine kurze Information für die Admins, die Windows 10 im Programm haben. Microsoft hat die letzte Baustelle (die Inkompatibilität ...

Sicherheit

Heise Beitrag Passwort-Sammlung mit 773 Millionen Online-Konten im Netz aufgetaucht

Information von Penny.Cilin vor 2 TagenSicherheit6 Kommentare

Auf Heise Online ist folgender Beitrag veröffentlicht worden: Heise Beitrag passwörter geleakt Ich bin mir jetzt nicht ganz sicher, ...

Heiß diskutierte Inhalte
TK-Netze & Geräte
TAPI auf einem Win2016Server installieren und einrichten
Frage von wstabelTK-Netze & Geräte28 Kommentare

Hallo liebe Admins, ich habe folgende Situation: 1 Windows Server 2016 Standard als DC 1 SNOM 710 IP-Telefon 1 ...

Batch & Shell
Mit findstr batch doppelte zeilen einer txt löschen
Frage von Burningx2Batch & Shell24 Kommentare

Hi Vor einer weile habe ich im netzt einen windows shell befehl gefunden mit welchem man über die konsole ...

Verschlüsselung & Zertifikate
Netzwerkfreigabe Verschlüsselung
Frage von grill-itVerschlüsselung & Zertifikate20 Kommentare

Moin zusammen, sicher nutzen hier die ein oder anderen ein Produkt zur Verschlüsselung von Netzwerkfreigaben/-laufwerken auf denen hochsensible Daten ...

Microsoft
Übertragung von MS Volumenlizenzen
Frage von SherlockineMicrosoft19 Kommentare

Ich bin Angestellte in einer kleinen 10-köpfigen IT-Firma, die Netzwerklösungen, Telefonielösungen und Ähnliches anbietet. Im Sommer hatten wir einen ...