VB Dateien vergleichen mit unterschiedlicher Spaltenanzahl

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    VB Dateien vergleichen mit unterschiedlicher Spaltenanzahl

    Hallo,

    ich möchte zwei Textdateien vergleichen anhand der Spaltenüberschriften.
    Also die Dateien haben unterschiedliche Anzahl von Spalten und unterschiedliche Anzahl von Zeilen (die eine hat 5 Zeilen und 7 Spalten, wobei das variieren kann; die andere 200 Zeilen und 20 Spalten).
    Die erste Zeile beinhaltet jeweils Namen zu den darunter aufgeführten Werten. In der 'großen' Datei sind also mehr Namen aufgeführt.
    Ich möchte die kleine Datei mit der großen vergleichen und in eine neue Datei die Werte mit Namen schreiben lassen, die gleich sind. Ist z.B. Parameter_5 in beiden Dateien, soll er mit all seinen 200 Zeilen in die neue Datei übernommen werden.
    Es soll also nur anhand der ersten Zeile ein Abgleich stattfinden, aber alle Zeilen zum Dazugehörigen Namen mitgeschrieben werden.
    Das müsste doch irgendwie mit zwei schleifen oder so gehen. Aber ich komme nicht drauf.
    Das Einlesen der beiden Dateien ist kein Problem.Wäre schön, wenn jemand mir helfen könnte.

    PS. Falls es wichtig ist, ich benutze Visual Studio 2015.

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

    VB.NET-Quellcode

    1. ​Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Const TRENNZEICHEN As Char = ";"
    3. Const DATEINAME As String = "filename"
    4. Const ANZAHLSPALTEN As Integer = 15
    5. Dim Felder() As String
    6. Dim Zeile As String
    7. Dim dt = New DataTable()
    8. Dim sr = My.Computer.FileSystem.OpenTextFileReader(DATEINAME, System.Text.Encoding.Default)
    9. For I As Integer = 0 To ANZAHLSPALTEN
    10. dt.Columns.Add(New DataColumn("Parametername " & I)) ' Spaltenüberrschriften erzeugen
    11. Next
    12. Do While (sr.Peek > -1) ' Dateiende abfragen
    13. Zeile = sr.ReadLine ' Eine Datenzeile lesen
    14. Felder = Zeile.Split(TRENNZEICHEN) ' Splitten in Felder
    15. Dim dr As DataRow = dt.NewRow ' Leere Datenzeile erstellen
    16. dr.ItemArray = Felder ' In DataRow speichern
    17. dt.Rows.Add(dr) ' Felder zur Datatable hinzufügen
    18. Loop
    19. DGV1.DataSource = dt ' DataTable in DataGridView zeigen
    20. End Sub




    Mit dem Code lese ich die Dateien als DataTable ein. Das Anzeigen bzw Ausgeben an DataGrid View ist nur für mich, kommt später wieder weg.

    zu 1) Ich dachte man könnte vielleicht mit dem streamreader.ReadLine.Split(CChar(";")) die zu vergleichenden Dateien einlesen und dann irgendwie in Schleifen abfragen.
    Man müsste zuerst den ersten Spaltennamen der einen Datei 'lesen' und dann mit allen Spaltennamen der zweiten Datei abgleichen.
    Dann würde man den zweiten Spaltennamen der ersten Datei lesen und mit allen Spaltennamen der zweiten Datei abgleichen.
    usw.

    zu 2) Normal würde man es mit einer If Abfrage machen oder. und mit einem zähler, also i as integer in der schleife? Also dann müsste man dieses If Spaltenname in erster Datei UND in zweiter Datei, dann writeline in neue Datei.

    Nur wie das als Code aussieht, weiß ich nicht. Weil ich nicht weiß, wie ich die einzelnen Spaltennamen vergleichen lassen kann.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sweet“ ()

    Wie setzt man den key fest?
    Hast du zufällig gute Links zu dem Thema?
    Wie schreibe ich dann die 'Dubletten' mit allen Zeilen in eine neue Datei?

    Edit:

    Ok den key kann man definieren wie man will im code. Aber ich bräuchte den variabel. Also nicht im Code festgeschrieben, sondern der key ist von Datei zu Datei anders. Mal stimmen spaltennamen 5 und 8 in beiden Datein überein, mal die spaltennamen 2 bis 13.

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

    zunäcchstma: Bitte editiere deinen Beitrag, und mach den Code leserlich, indem du die ForumFunktionalität nutzst:


    Zum Code, soweit ichs (trotzdem) überblicke: Der gibt zu den beiden von mir aufgeworfenen Fragen ja garnix her:
    Weder findest du damit heraus, welche Spaltennamen in soner Datei existieren, noch, wie man eine (oder mehrere) Spalten gezielt ausliest, wenn sie denn bekannt ist/sind.

    Mit Dictionary oder Doubletten auffinden kannst du doch erst anfangen, wenn du ühaupt die Spalten hast.
    Ausserdem gehts hier garnet um Doubletten (also in einer Liste mehrfach vorkommende Werte), sondern es geht um Mappings (also um Werte, die in 2 verschiedenen Listen einander entsprechen).
    Deshalb frage ich ja. Weil ich nicht weiß wie es geht...

    Kannst du mir nen Tipp geben? Nen schubs in die richtige Richtung?

    Mir wurde dictionary geraten, deshalb hatte ich mir dictionary dann angesehen.

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

    wie gesagt: Dictionary ist der zweite Schritt vor dem ersten (und HashSet wäre eh angemessener, doch dazu später).
    Zunächstmal das Auslesen der Spaltennamen aus der Datei.
    Kann ich dir nicht vorsagen, denn ich habe deine Dateien nicht.
    Du musst wissen, an welcher Stelle in der Datei die SpaltenNamen stehen. (jo, und da musste sie halt auslesen)
    ja, genau.
    Übrigens einen Char notiert man in vb nicht als CChar(";"), sondern einfach ";"c.
    gut, dann hast du also die SpaltenNamen in einem String-Array.
    Und dann kannst du anfangen, und eine Methode schreiben, die von beiden Dateien die ColumnNames entgegennimmt, dann innen drin vergleicht, und am Ende ein neues String-Array returnt, welches die gemeinsamen SpaltenNamen zurückgibt - das ist mit Linq sogar überaus einfach:

    VB.NET-Quellcode

    1. Imports System.Linq
    2. '...
    3. Private Function GetCommonColumnNames(columnNames1 As String(), columnNames2 As String()) As String()
    4. Return columnNames1.Intersect(columnNames2).ToArray
    5. End Function
    Tja, nun isses vorgekaut, und die einzig verbliebene Herausforderung wäre, zu verstehen, was diese unheimliche Intersect() - Funktion eiglich ist, und was die macht, das ist nämlich eine generische Extension-Methode für das IEnumerable(Of T) - Interface - welches ja von String() (dem Datentyp von - guck hin! - sowohl columnNames1 als auch columnNames2) implementiert wird - alles klar? ;)