Datei unter VB öffnen, auslesen und im Array speichern

FunthomasX

Grünschnabel
Hallo,
seit neuestem muss ich mich mit VB rumschlagen in meinem Praktikum und muss so zu Einstieg eine Asciidatei öffnen, in der zwei Zahlencodes und eine Beschreibung steht.
Bsp:

PN33341 -PK3344 Radlager links
PK45345 -PK4443 Gelenk vorn
.....
usw. (die Datei wird von einem anderen Programm erzeugt)

wie kann ich das nun am Besten in einem Unterprogramm anstellen, dass er gleich beim Öffnen Zeile für Zeile einliest und idealer Weise die Daten in verschiedene Arrays speichert. Ich möchte am Ende zwei Arrays voll mit ID-Nummmern und ein Array mit Beschreibung haben. Oder ist es nicht möglich die später wieder einander zuzuordnen und man daher praktischerweise Zeilenweise in den Array schreibt, ohne zu unterscheiden.
Wie würde das Einlesen bzw. Einschreiben in den Array denn aussehen in VB ?

Danke für Eure Hilfe

FunthomasX ;)
 
Code:
Public Dateiinhalt() As String       ' globales Array für den Dateiinhalt

      
public sub Datei_Einlesen(ByVal Datei As String)

        dim Dateinummer as long             ' Variable für Dateinummer
        dim Zähler as long                       ' "Zeiger" für Array

        Zähler = 1

        Dateinummer = freefile

        Open Datei For Input Access Read Lock Write As Dateinummer   ' Öffne Datei

        Do
            ReDim Preserve Dateiinhalt(1 To Zähler)                            ' erweitere dynamisches Array um einen Eintrag
            Line Input #Dateinummer, Dateiinhalt(Zähler)                                       ' Lies Zeilenweise die Datei
                Zähler = Zähler + 1                                                      ' erhöhe Datensatzzähler um 1
         
        Loop Until EOF(Dateinummer)                                         ' Einlesen durchführen bis Dateiende

        Close Dateinummer

end sub

Der Aufruf der Sub erfolgt mit dem Dateipfad/-namen als Argument, z.B.:

Code:
call Datei_Einlesen("c:\Datei.txt")

Ich gebe keine Garantie, da ich den Code nicht getestet habe !
 
Zuletzt bearbeitet:
danke erstmal..werde ich morgen auf der Arbeit mal probieren und schreib dann ob es geklappt hat.
Falls noch wer was weiss , immer her damit ;)

FunthomasX
 
Danke RamonR ,

dein Code hat gewirkt ;)
hab noch ein 2 Sachen abgeändert, dann lief es ( z.B. lock write kann weggelassen werden und was ist eigentlich mit dem End If gemeint... hab ich gelöscht).
Auf jeden Fall macht es das was es soll er füllt den Array mit Daten die so aussehen:
=KM -4U4 left turnupring low pressure
=KM -10U1 left bladder high pressure
..........

Soweit so gut, jetzt wäre es von Vorteil, wenn ich die Texte geliedert wieder in ein weiteres Array schreibe, zb:
Array 1 : Array 2: Array 3:
=KM -4U4 left turnupring low pressure
=KM -10U1 ........
.... .... ....
kann ich jetzt mit Len() und Trim() das hinkriegen das er mit den Text wieder aufteilt oder gibt es eine Funktion die den Array Stück für Stück durchläuft und immer dann in einen Array schreibt, wenn ein Leerzeichen kommt ?

THX FunthomasX :rolleyes:
 
Da gibt es die Split-Funktion die einen String nach einem beliebigen Trennzeichen durchsucht und in ein Array schreibt.

Syntax: Split(Expression, delimiter)

z.B.

Code:
 Dim Beispielstring as String
 
 Beispielstring = Split(Beispielstring, " ")
 
Hallo FunthomasX,

zu meinem Code:

Das "end if" war wirklich an der Stelle falsch, ich hatte die Sub schnell aus einem meiner Projekte rauskopiert und es aus versehen stehen lassen.

Das "lock write" bewirkt nur, dass bis zum Schließen der Datei kein anderes Programm schreibend auf sie zugreifen kann. Ist optional und nicht immer notwendig, schadet aber nichts.

Für das Problem des Zerlegens hat dignsag vollkommen rechts, da ist die Splitvar-Funktion optimal. Falls Du damit nicht klar kommst, poste einfach Deine Probleme !

Gruß
Ramon
 
Hi,
wie erwarte läuft das mit Split und Filter nicht so wie ich will.
Ich liste mal den Code..
Code:
Public Sub Datei_Einlesen(ByVal Datei As String)

Dim Dateinummer As Long
Dim Zähler As Long
Zähler = 1
Dateinummer = FreeFile

Open Datei For Input Access Read As Dateinummer 
  Do
    ReDim Preserve Dateiinhalt(1 To Zähler)
    Line Input #Dateinummer, Dateiinhalt(Zähler)
        Debug.Print Dateiinhalt(Zähler)
        Zähler = Zähler + 1
Loop Until EOF(Dateinummer)
Close Dateinummer
    
End Sub

Private Sub Command1_Click()

Dim Zähler As Long
ReDim Preserve ArrayZerlegt1(Zähler)

ArraZerlegt1 = Split(Dateiinhalt) ' Fehlermeldung: Fehler beim kompilieren
                                              ' Typen unverträglich
' ArrayZerlegt1 = Filter(Dateiinhalt, "PK")   Bei dem gibt er nur die erste Zeile aus
Debug.Print ArrayZerlegt1(Zähler)

End Sub

Also Split macht er schon mal gar nicht, da kommt immer "Fehler beim kompilieren Typen unverträglich" . Wenn ich den ArrayZerlegt1 über die Filterfunktion zerlegen will, dann haut er mir immer nur die erste raus(Im Debugfenster zu sehn). Er durchläuft nicht den kompletten Array. Eigenlich ist es egal was ich als Suchkette zu trenne angebe. Er haut immer die erste Zeile des Arrays Dateiinhalt raus. :mad:
Mein Ziel der Sache sollte eigentlich mal die endgültige Zerlegung des Arrays Dateiinhalt in drei Gruppen sein. Eine Gruppe (Arrray) mit ID-Nummer1 , dann die Gruppe Beschreibung und zuletzt noch einemal eine ID-Nummer2(wenn vorhanden).
Mit meinen Versuchen wollte ich ersteinmal probieren den eingelesenen Dateiinhalt aufzutrennen.

Tja ....... :( ...was läuft falsch und wie kann mal das am Besten lösen

THX FunthomasX
 
Kommando zurück 1

ok, dass mit filter hab ich jetzt verworfen. Ein Kollege meinte das finge wohl nur unter VBScript. ich mach das jetzt folgendermaßen:
Code:
Private Sub Command1_Click()

Dim x As Integer
Dim Wort, Wortlänge, Erg
Dim Startneu As Integer
Dim Start As Integer

ReDim Preserve ArrayZerlegt1(Zähler)
Startneu = 1
    
    For x = 1 To Zähler - 1
    
    Debug.Print Dateiinhalt(x)
    Start = 0
    Wort = 1
    Do
        Start = Startneu
        Wort = InStr(Start, Dateiinhalt(x), Chr(9))
        Wortlänge = Wort                       'hier wie weitermachen Knackpunkt muss hier sein
        Erg = Mid(Dateiinhalt(x), Startneu, Wortlänge)
        Startneu = Wortlänge + 1
        Debug.Print Erg
        ArrayZerlegt1(x) = Erg
        Debug.Print ArrayZerlegt1(x)
    Loop Until Wort = 0
    Next
    
End Sub
Neues Problem liegt nun in der neuen Startposition von der InStr() ! Bei den ersten beiden klappt es noch, dann hat er den neuen Startpunkt nich bei 10 sondern bei 6.
Hier der erste String der durchlaufen werden soll:
=PK -1Y4 main valve on 1
Das ist im moment so, dass ich den Wald vor Bäumen nicht sehen kann ;-)

THX FunthomasX
 
Hi FunthomasX

Also, wenn ich das alles so korrekt sehe, hast Du ja ein relativ feststehendes Muster in den Daten. Sie sind alle durch (ich vermute mal) ein Leerzeichen getrennt. Daraus würde ich ableiten, dass die Werte anhand dieser Tatsache extrahiert werden können.

Ich gehe davon aus, dass die Variablen Dateiinhalt und Zähler global definierte Variablen sind

Mein Ansatz:
Dim szZuZerlegen As String
Dim szWert1 As String
Dim szWert2 As String
Dim szWert3 As String

szZuZerlegen = Dateiinhalt(X)
szWert1 = Left$(szZuZerlegen, Instr(szZuZerlegen, " ") -1)
szZuZerlegen = Trim$(Mid$(szZuZerlegen, Instr(szZuZerlegen, " ") + 1))
szWert2 = Left$(szZuZerlegen, Instr(szZuZerlegen, " ") -1)
szWert3 = Trim$(Mid$(szZuZerlegen, Instr(szZuZerlegen, " ") + 1 ))

Damit hast Du jetzt drei Werte, die Du Deinem Array zuweisen kannst. Ich hoffe, ich habe keine Klammer oder Kommas vergessen. Wenn der Trenner wirklich CHR(9) ist wechsle einfach Instr(szZuZerlegen, " ") durch Instr(szZuZerlegen, Chr$(9)) aus.

Gruß
Das Orakel
 

Neue Beiträge

Zurück