Datenzusammenfassen

  • Allgemein

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von avbl.

    Datenzusammenfassen

    Hallo zusammen,

    ich brauche unbedingt etwas Hilfe.
    Ich versuche zur Zeit aus mehreren .txt Datein Zahlen auszulesen und diese alle gebündelt in eine neue einzufügen.
    Da es sich hier um mehrere hundert handelt, würde ich das gerne automatisch machen.

    meine datein sehen wie folgt aus:

    xxxxxxx
    yyyyyy
    zzzzzz

    a b
    a b
    a b
    ....

    für mich ist jeweils nur die b Spalte von Interesse. Wie kann ich diesen oberen xyz Block umgehen? die zweite Zeile kann ich ja mit GetSecondColomn() auswählen.

    insgesamt habe ich 100 Datein von denen jeweils die zweite Spalte entnommen werden und die dann in eine neue datei nebeneinander eingefügt werden sollen.

    Ich würde mich sehr über eine Rückmeldung freuen

    Gruß

    avbl
    Das sind ein paar wenige Informationen.

    Ist "a b" immer in der selben Zeile? Oder gibt es ein einleitendes Wort (z.B. "ValueTable:")?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    hi,

    a und b stehen für unterschiedliche Zahlen, wobei die Zeile für Zeile auch wieder anders sind. a ist eine fortlaufende Zahlenfolge, die ich jedoch für meine weitere Betrachtung nicht brauche.
    z.B. so:

    0 6769
    1 8967
    2 783
    3 ...
    4 ...
    ... ...
    und davon jeweils mehrer hundert untereinander.

    Hoffe es ist etwas klarer geworden.

    Gruß

    avbl schrieb:

    und davon jeweils mehrer hundert untereinander.
    Das ist unwichtig.
    Eine Zeile in Datei A sieht so aus: "a b c d e"
    eine Zeile in Datei B sieht so aus: "1 2 3 4 5"
    und ich möchte, dass in einer Datei C folgendes aus A und B drin steht: "a 1 b 2 c 3 ..."
    oder was auch immer.
    Was also soll in C rein?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bin mir nicht ganz sicher was du meinst, aber ich glaube wir reden noch aneinander vorbei.
    Ich mache nochmal ein Beispiel:

    Datei1.txt enthällt:


    xxxx
    yyyyy
    zzzzz
    wwww
    qqqq
    rrrrrr

    0 687
    1 879
    2 464
    3 485

    eine zweite Datei: Datei2.txt ist wieder genau so aufgebaut nur das sich die Zahlen in der zweiten Spalte verändert haben.Meinetwegen so :


    xxxx
    yyyyy
    zzzzz
    wwww
    qqqq
    rrrrrr

    0 598
    1 534
    2 178
    3 863



    und aus den verschiedenen Datein möchte ich am ende eine neue Datei haben, die jeweils die einzelnen zweiten Spalten nebeneinander enthällt, quasi so:


    687 598 ... ...
    879 534 ... ...
    464 178 ... ...
    ... ... ... ....

    der obere Block mit x,y,z,w,q,r sieht ungefähr so aus in den einzelnen Zeilen: Text=56

    am idealsten wäre es natürlich, wenn ich die Zahlen direkt in excel bekommen würde.
    Wie groß sind die Dateien?
    Ich würde sie einfach per ReadAllLines in ein Stringarray packen und dann die 6 Anfangszeilen verarbeiten.
    Wenn du immer ein '=' verwendest lässt sich das damit ja einfach splitten und gut ist.

    Für jede weitere Zeile dann Split mit dem Leerzeichen ' ' und dann eben die Werte in einem Array anhängen:

    Array(3) = " " & ZeileInAktuellerDatei(3).Split(" ")(1)

    Dann müsstest du eigentlich ein ganz gutes Ergebnis haben.
    Für's Ende dann eben das Array durchgehen (for-Schleife) und jeweils noch den Wert davor setzen:

    CStr(i) & Array(i)

    Sollte dann als 0. aaa bbb ccc etc... enden...
    Wenn Du die Dateien alle auf einen Schlag einlesen kannst, sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private l1() As String
    3. Private l2() As String
    4. Private l3() As String
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. l1 = System.IO.File.ReadAllLines("File1")
    7. l2 = System.IO.File.ReadAllLines("File2")
    8. l3 = System.IO.File.ReadAllLines("File3")
    9. Dim ar As New List(Of String)
    10. For i As Integer = 6 To Math.Min(l1.Length, Math.Min(l2.Length, l3.Length)) - 1
    11. Dim txt As String = ""
    12. txt &= part2(l1, i) & vbTab
    13. txt &= part2(l2, i) & vbTab
    14. txt &= part2(l3, i)
    15. ar.Add(txt)
    16. Next
    17. System.IO.File.WriteAllLines("File4", ar.ToArray)
    18. End Sub
    19. Private Function part2(ll() As String, line As Integer) As String
    20. Dim parts() As String = ll(line).Split(" "c)
    21. Return parts(1)
    22. End Function
    23. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    viele Dank schonmal für die Tipps. Leider funktioniert das nicht ganz so wie ich mir das vorstelle.
    Meine Idee ist jetzt, jede einzelne Zahl auszulesen und direkt nach excel zu schreiben.

    also z.B. Wert aus Zeile 1 Spalte 2 ( aus der Datei, die wie oben aufgebaut ist) in Excel Zeile 1 Spalte 1, dann Wert aus Zeile 2 Spalte 2 in Excel Zeile 2 Spalte 1 und so weiter.

    Weiss aber nicht wirklich, wie ich das umsetzen soll. Bin für jede Hilfe sehr dankbar.

    Gruß avbl
    Was hindert Dich daran, zunächst alle Zeilen einzulesen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    ich hatte ursprünglich vor, den neuen Datensatz dann einfach in excel reinzukopieren. Hab das jetzt aber mit einer Beispieldatei ausprobiert und die Daten werden nicht ordentlich jede Zahl in ein Feld geschrieben. So bringt mir das dann gar nix. Also bleibt mir wohl nur der Weg die alle einzeln übertragen zu lassen. Oder hättest du noch eine andere Idee?
    Sicherlich ließe sich da was machen, aber ich präferiere nun mal die Variante mit der wenigen Arbeit.
    Wieviele Zeilen sind es denn in der Datei?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oh oh, da fang mal besser mit einer anständigen Modellierung an. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    pro datei 500 und dateien sind es 100 ingesamt


    Liegen alle Dateien in einem gesonderten Verzeichnis?
    Haben die Dateien fortlaufende Nummern? (Wie heißen die Dateien?).
    Müssen die Daten in einer bestimmten Reihenfolge in der EXcel-Datei stehen?
    Stimmen deine Beispiele? (Die benötigten Daten fangen alle in der 8. Zeile an?).


    Hier ein VBA-Beispiel:
    Dateien müssen sich im separatem verzeichnis befinden. Datenreihenfolge stimmt evtl. nicht.

    VB.NET-Quellcode

    1. Sub test()
    2. Dim t As String, datei As String, pfad As String
    3. Dim i As Long, sp As Long, ze As Long
    4. sp = 1
    5. ze = 1
    6. pfad = "d:\##\" '<--- Pfad anpassen. Backslash am Ende!
    7. datei = Dir$(pfad & "*.txt") '< ---evtl.anpassen
    8. While Len(datei)
    9. Debug.Print datei 'Zur Info
    10. Open pfad & datei For Input As #1
    11. i = 0: ze = 1
    12. While Not EOF(1)
    13. i = i + 1
    14. Line Input #1, t
    15. If i > 7 Then
    16. Cells(ze, sp).Value = Mid$(t, InStr(1, t, " ") + 1)
    17. ze = ze + 1
    18. End If
    19. Wend
    20. Close
    21. sp = sp + 1
    22. datei = Dir$
    23. Wend
    24. End Sub
    - ja, sie liegen alle in einem Verzeichnis
    - ja haben sie von 1 bis 100
    - die Reihenfolge der Spalten ist im Grunde egal, wichtig ist nur dass die Zeilen zueinander passen. Da ich die am ende weiter verrechnen muss
    - nein, start der beiden spalten ist in der 11. Zeile

    so sieht das aus:


    hfghfgh
    fghgh
    ffgghh
    fhfghfgh
    fghhfhfgh
    fghfghfghfghh




    0 17850
    1 17852
    2 17843
    3 17850
    ...

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

    - nein, start der beiden spalten ist in der 11. Zeile

    Dann ändere im VBA-Beispiel 'If i > 7' Then' in 'If i > 10 Then'

    ja, sie liegen alle in einem Verzeichnis
    - die Reihenfolge der Spalten ist im Grunde egal,


    Wenn sich keine anderen txt-dateien im Verzeichnis befinden, kannst du das skript ausführen.
    Ansonsten musst du müsstest du die zeile 'datei = Dir$(pfad & "*.txt") ' anpassen.
    Z. B. Bei datei1.txt bis Datei100.txt 'datei = Dir$(pfad & "datei*.txt")


    Und hier noch ein Beispiel für die reihenfolge von 1 bis 100:

    VB.NET-Quellcode

    1. Sub test2()
    2. Dim t As String, datei As String, pfad As String
    3. Dim i As Long, sp As Long, ze As Long, d As Long
    4. sp = 1
    5. pfad = "d:\##\" '<--- Pfad anpassen. Backslash am Ende!
    6. For d = 1 To 100
    7. datei = "MeineDatei" & CStr(d) & ".txt" '<--- Dateinamen anpassen
    8. If Len(Dir$(pfad & datei)) Then
    9. Debug.Print datei 'Nur zur Info
    10. Open pfad & datei For Input As #1
    11. i = 0: ze = 1
    12. While Not EOF(1)
    13. i = i + 1
    14. Line Input #1, t
    15. If i > 10 Then
    16. Cells(ze, sp).Value = Mid$(t, InStr(1, t, " ") + 1)
    17. ze = ze + 1
    18. End If
    19. Wend
    20. Close
    21. sp = sp + 1
    22. Else
    23. MsgBox ("Datei " & datei & "nicht vorhanden")
    24. End If
    25. Next
    26. End Sub

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

    hallo,
    nochmals vielen Dank für die Mühe. Allerdings bekomme ich den Quellcode so nicht zum laufen. Hab Pfad und Dateiname ergänzt.

    Wenn ich es aber mit .vbs ausführe, dann kommt direkt in Zeile 2 Zeichen 7 "Anweisungsende erwartet".
    Wenn ich es mit .wsf starte, dann kommt ganz am ende die Meldung "Nicht abgeschlossener Entitätsverweis - entsprechendes ';' nicht gefunden.

    Was mache ich falsch?Hab schon gegoogelt, bin bisher aber nicht fündig gewurden.

    Gruß