Daten aus Textdatei auslesen

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von FBM.

    Daten aus Textdatei auslesen

    Hallo,
    ich habe folgendes Problem.
    Ich möchte eine Textdatei auswerten und die Daten in eine Excel Tabelle schreiben.

    Also hier ein Bsp.:
    12.12.2010 ---------------------------------------------------------------
    ------------------------------------------------------------------------------
    Info 1: 1,4 Info2: 13,4 SrNr.: 1233-133133-31635
    ------------------------------------------------------------------------------
    Info 3: -17,87
    ------------------------------------------------------------------------------

    15.12.2010 ---------------------------------------------------------------
    ------------------------------------------------------------------------------
    Info 1: 51,6 Info2: 16,9 SrNr.: 1233-133133-31636
    ------------------------------------------------------------------------------
    Info 3: 5,87
    ------------------------------------------------------------------------------

    {u.s.w.}
    So nun würde ich gerne die Textdatei so auswerten, dass mir Excel in eine Tabelle untereinander Datum (Spalte 1), Info 1-3 (Spalte 2-4) und Sr.Nr. (Spalte 5) auswirft.
    Habe das hier bisher im Forum gefunden und auch schon den ganzen Tag rumprobiert:(Glaube aber das es für mich der Falsche Ansatz ist)

    Visual Basic-Quellcode

    1. Dim Zeile As String
    2. Open "C:\t.txt" For Input As #1
    3. Do While Not EOF(1)
    4. Cells(Rows.Count,1).End(xlUp).Offset(1,0) = Zeile
    5. Loop
    6. Close #1
    7. End Sub

    Habe versucht das irgendwie umzuschreiben aber erfolglos...

    Gibt es irgendwie eine Möglichkeit eine "Maske" zu erstellen die so oft durchläuft bis die Textdatei zu Ende ist???
    Also das mit den durchlaufen kann man ja sicher mit (Do..Loop) machen, aber ich habe keine Idee wie man so eine Maske erstellt und habe auch kein Beispiel dafür gefunden.

    Könnt ihr mir da vllt. weiterhelfen?

    LG fbm
    Du müsstest den Text auch der Variable Zeile zuweisen!
    Mit der Methode, die du angefangen hast, müsste da ein Input-Statement stehen.

    Aber da du mit der Methode beliebig Schwierigkeiten bei der Textauswertung bekommen wirst, würde ich auf das FileSystemObject umsteigen.
    Schau dir hier das Vbscript-Beispiel an:
    msdn.microsoft.com/en-us/library/314cz14s(v=VS.85).aspx

    Das kannst du fast 1:1 kopieren.
    Den mittleren Teil (Open for output und Write) kannst du weglassen und im Read-Teil ersetzt du die Zeile

    Visual Basic-Quellcode

    1. Document.Write TextLine & "<br />"
    durch deinen eigenen Code (Zeile in Felder splitten und in Excel-Felder speichern).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank, aber irgendwie sehe ich noch nicht wo/wie ich das diese Maske eingeben kann,..
    also ich habe es so:

    Visual Basic-Quellcode

    1. Const ForReading = 1, ForWriting = 2, ForAppending = 8
    2. Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
    3. Dim fso, MyFile, FileName, TextLine
    4. Set fso = CreateObject("Scripting.FileSystemObject")
    5. Set MyFile = fso.OpenTextFile("c:\test\testfile.txt", ForReading)
    6. Do While MyFile.AtEndOfStream <> True
    7. TextLine = MyFile.ReadLine
    8. Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = TextLine
    9. Loop
    10. MyFile.Close


    Irgendwie macht er das gleiche wie vorher, er schreibt mir den gesamten Text Zeile für Zeile in die erste Spalte,
    aber ich möchte ja in der ersten Spalte immer nur das Datum..>.<
    Hier mal ein Beispiel wie du die Textdatei mit ganz normalen Basic-Befehlen (Grundlagen) bearbeiten kannst.
    Es wird eine neue Datei erstellt, in der die Daten in der von dir gewünschten Reihenfolge, durch Semikolon getrennt stehen. Statt Print #2 musst du die Daten in die entsprechenden Zellen schreiben.

    Der Code funktioniert mit deinem Textbeispiel. Info 1 mit Leerzeichen, Info2 ohne?
    Falls das Beispiel von dir manipuliert oder 'verschönert' wurde, musst du den Code anpassen.

    Visual Basic-Quellcode

    1. SUB textlesen
    2. DIM Zeile AS STRING
    3. DIM SrNr AS STRING
    4. DIM s AS LONG
    5. DIM x1 AS LONG
    6. DIM x2 AS LONG
    7. OPEN "c:\t.txt" FOR INPUT AS #1
    8. OPEN "c:\test.txt" FOR OUTPUT AS #2
    9. DO WHILE NOT EOF(1)
    10. LINE INPUT #1, zeile
    11. IF LEN(zeile) THEN
    12. IF s = 0 THEN
    13. IF INSTR("2310", LEFT$(zeile, 1)) THEN
    14. PRINT #2, LEFT$(zeile, 10) & ";" ; 'Datum
    15. s = 1
    16. END IF
    17. END IF
    18. IF s = 1 THEN
    19. IF INSTR (zeile, "Info 1:") THEN
    20. x1 = INSTR(zeile, "Info2:")
    21. x2 = INSTR(zeile, "SrNr")
    22. PRINT #2, TRIM$(MID$(zeile, 8, x1 - 8)) & ";" ; 'Info 1
    23. PRINT #2, TRIM$(MID$(zeile, x1 + 7, x2 - x1 - 7)) & ";" ; 'Info2
    24. SrNr = TRIM$(MID$(zeile, x2 + 7))
    25. END IF
    26. IF INSTR(zeile, "Info 3") THEN
    27. PRINT #2, TRIM$(MID$(zeile, 8)) & ";" ; 'Info 3
    28. PRINT #2, SrNr 'SrNr
    29. s = 0
    30. SrNr = ""
    31. END IF
    32. END IF
    33. END IF
    34. LOOP
    35. CLOSE
    36. END SUB
    Vielen Dank, das ist genau das was ich gebraucht habe!
    Habe jetzt oben den Code so umgeschrieben das er direkt in die Excel Datei importiert wird...

    Also so z:B. für Info 1:

    Visual Basic-Quellcode

    1. Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = Trim$(Mid$(Zeile, 8, x1 - 8))


    Er würde den Wert jetzt also immer in die zweite Spalte schreiben, ein Problem ergibt sich nun wenn der Wert = 0 ist, also das Feld einfach leer ist. Wenn nämlich eine Zelle in Excel leer bleibt benutzt Excel diese Zelle für den nächsten Durchlauf. Sprich der Wert des nächsten Datensatzes kommt dann in den davor rein.
    Gibt es eine Möglichkeit das zu verhindern?

    @petaod: Das mit Funktionen habe ich mir nochmal durchgelesen und verstanden. : )
    Sprich der Wert des nächsten Datensatzes kommt dann in den davor rein.
    Gibt es eine Möglichkeit das zu verhindern?


    Wenn z. B. die Zeilenanzahl pro Datensatz gleich ist, könntest du die Auswertung der Daten von den Zeilen nach dem Datum abhängig machen.



    Wie ich schon geschrieben habe: Der Code funktioniert mit deinem Textbeispiel.

    Am einfachsten ist es, du zeigst mal einen original Auszug aus der Textdatei mit allen Daten-Varianten.
    Ja die Datensätze sind alle identisch, immer oben das Datum und der ganze Aufbau ist auch gleich. Nur die Abstände zwischen z.B Info 1 und Info 2 sind natürlich immer verschieden, da ja immer andere Zahlen dazwischen stehen.

    Mein Problem ist folgender Fall:

    12.12.2010 ---------------------------------------------------------------
    ------------------------------------------------------------------------------
    Info 1: 1,4 Info2: SrNr.: 1233-133133-31635
    ------------------------------------------------------------------------------
    Info 3: -17,87
    ------------------------------------------------------------------------------

    15.12.2010 ---------------------------------------------------------------
    ------------------------------------------------------------------------------
    Info 1: 51,6 Info2: 16,9 SrNr.: 1233-133133-31636
    ------------------------------------------------------------------------------
    Info 3: 5,87
    ------------------------------------------------------------------------------


    Im ersten Datensatz wäre jetzt Info 2 leer, wenn ich das nun in Excel (mit der meiner Variante oben) schreiben lasse kommt folgendes dabei heraus..



    Die 16,9 ist nun im ersten Datensatz gelandet (obwohl ja bei diesem kein Wert zu sehen ist, also der gleich 0 ist), da die Tabelle an dieser stelle leer war und Excel die Tabellen nach einander befüllt.

    Der Datensatz an sich sieht halt schon fast so aus(etwas länger)... möchte halt nur nicht genau den einstellen.

    edit: Kann es sein das er sofort abbricht wenn er eine Variable nicht findet? Mein original Datensatz ist ja ein paar Zeilen länger, also wollte ich das nun mit den Datum anpassen und wollte das Datum mal "allein" durchlaufen lassen. Aber er zeigt immer nur das erste und bricht dann ab...
    Alles scheinbar schwieriger als ich dachte. Was gibt den in Zeile 18 (beim Datum) diese "2310" an? X( Habe schon danach gesucht aber nichts gefunden...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FBM“ ()

    FBM schrieb:

    Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = Trim$(Mid$(Zeile, 8, x1 - 8))

    Du kannst deine Spalten über den Offset adressieren und die erste freie Zelle immer in der ersten Spalte suchen:

    Visual Basic-Quellcode

    1. Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = Trim$(Mid$(Zeile, 8, x1 - 8)) 'Spalte 1
    2. Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = Trim$(Mid$(Zeile, 8, x1 - 8)) 'Spalte 2
    3. Cells(Rows.Count, 1).End(xlUp).Offset(0, 2) = Trim$(Mid$(Zeile, 8, x1 - 8)) 'Spalte 3
    Im übrigen würde ich mir die Zeile nur einmal berechnen und für die restlichen Felder aus einer Variablen ziehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die 16,9 ist nun im ersten Datensatz gelandet (obwohl ja bei diesem kein Wert zu sehen ist, also der gleich 0 ist), da die Tabelle an dieser stelle leer war und Excel die Tabellen nach einander befüllt.


    Die Test.txt gibt die richtigen Werte aus:
    12.12.2010;1,4;;-17,87;1233-133133-31635
    15.12.2010;51,6;16,9;5,87;1233-133133-31636

    Also ist deine Umsetzung falsch.
    Die Zeilen der Spalten 2 - 5 dürfen nicht die »nächste freie«, sondern müssen »wie in Spalte 1« sein.

    … also wollte ich das nun mit den Datum anpassen und wollte das Datum mal "allein" durchlaufen lassen. Aber er zeigt immer nur das erste und bricht dann ab...

    Er bricht nicht ab, er sucht nach "Info 1:" usw.
    Siehe Variable s. Zum Datum-Test mach' aus s = 1 REM s = 1 oder 's = 1.

    Was gibt den in Zeile 18 (beim Datum) diese "2310" an? X( Habe schon danach gesucht aber nichts gefunden...

    Lies dir die Beschreibung von INSTR genau durch.
    "3210"
    31.12.
    22.11.
    11.11.
    01.10.
    @petaod: Ja genau so habe ich es ja bisher gemacht, das Problem ist ja nun genau das. Also das sich Excel die nächste freie Zelle schnappt und dann so was wie in meinen letzten Beitrag passiert.

    Habe überlegt ob man das so machen kann:

    Visual Basic-Quellcode

    1. If Zeile.Value = "" Then
    2. Zeile.Value = 0
    3. end if


    .. aber das geht nicht... kommen nur viele Fehler : (

    @eierlein: Vielen Dank! Ach so funktioniert das mit den Datum... Cool habe das jetzt schon mal hin bekommen für alle Datensätze, die anderen bekomme ich auch hin... nur halt das Problem mit den freien Zellen bleibt...

    FBM schrieb:

    Ja genau so habe ich es ja bisher gemacht
    Das glaube ich nicht ;)
    Schau meinen Code genau an und versuch ihn zu verstehen. Die Parameter (bei Cells und bei Offset) sind anders als bei dir.
    Du suchst in jeder Spalte von unten nach der ersten freien Zelle.
    Ich referenziere immer auf die erste Spalte.

    Oder mach´s auf die herkömmliche Weise, wenn du die Range-Properties nicht verstehen magst:

    Visual Basic-Quellcode

    1. r=Cells(Rows.Count, 1).End(xlUp).Row+1 'next free row
    2. Cells(r,1).Formula=Value1
    3. Cells(r,2).Formula=Value2
    4. Cells(r,3).Formula=Value3

    Sorry für den scharfen Ton, aber wenn ich mir schon die Mühe mache, könntest du meine Vorschläge wenigstens genau anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ach so, habe den Test die ganze Zeit nur mit Info 1 gemacht ohne das Datum abzufragen. Deswegen habe ich nur die erste Spalte benutzt und dachte es geht nicht. X(

    Nein , also jetzt funktioniert es wunderbar! Vielen Dank euch beiden, habt mir wirklich sehr geholfen!!!