CSV/XLS Import und Export mit Änderungen der Inhalte - Ich werd verrückt!

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Phenom.

    CSV/XLS Import und Export mit Änderungen der Inhalte - Ich werd verrückt!

    Tag Leute,

    jetzt hab ich mich dann doch mal hier angemeldet um ein wenig mehr in die Materie einzusteigen und Ideen mit Anderen zu tauschen.
    Ich habe schon ein klein wenig Erfahrung was die einfacheren Dinge in Sachen .Net betrifft, dennoch beiße ich mir gerade die Zähne aus.

    Ich würde gerne eine .xls-Datei oder eine CSV importieren und die Inhalte mit vorgegebenen Inhalten ergänzen.
    Das Importieren in ein Datagridview war nach Google möglich, aber das Ändern der Inhalte und speichern des Ergebnisses bring ich nicht auf die Reihe.
    Die Beispiele unten sind natürlich frei erfunden uns sollen lediglich darstellen, wie die Funktionsweise ablaufen sollte...

    Sollte wie folgt laufen:

    - Klick auf Button -> Openfiledialog -> CSV-Datei wählen -> Importieren

    Inhalt der zu importierenden CSV (Beispiel):

    Vorname;Nachname;Alter;Wohnort;HTML
    Hans;Wurst;18;Musterhausen;
    Micky;Maus;12;Entenhausen;

    Es sollen nun die Inhalte importiert und beim importieren oder exportieren mit html-code und styles ergänzt werden.
    Dazu sollen die jeweiligen Inhalte einer Zeile ausgelesen, mit html-code ergänzt und in die letzte Zelle einer Zeile geschrieben werden.
    Das Programm soll also zum Beispiel den Vornamen, Nachnamen, Alter und Wohnort einer Zeile lesen und diese Infos mit html-code formatiert
    in die letzte Zelle der Zeile schreiben.

    Beispiel der zu exportierenden CSV:

    Vorname;Nachname;Alter;Wohnort;HTML
    Hans;Wurst;18;Musterhausen;<h1>Hans</h1><h2>Wurst</h2><strong>18</strong><h3>Musterhausen</h3>
    Micky;Maus;12;Entenhausen;<h1>Micky</h1><h2>Maus</h2><strong>12</strong><h3>Entenhausen</h3>

    Das Ganze dann als neue CSV-Datei abspeichern.


    Wie könnte ich das am besten angehen? Bin hier am Ende mit meinem Latein und hoffe, Jemand erbarmt sich.
    :love:

    Danke im Voraus.

    Phenom schrieb:

    Wie könnte ich das am besten angehen?


    Da Du nicht gleichzeitig dasselber File lesen und schreiben kannst, liest Du die .csv Datei zeilenweise und schreibst sie ergänzt in ein anderes (temporäres) File weg. Das geschieht ungefähr so:
    - ermitteln des FileNamens per OpenFileDialog
    - öffnen eines StreamReaders zum Lesen und Streamwriters zum Schreiben ( -> Link)
    - zeilenweises Einlesen in einer Schleife (s.o.)
    - Zeile wird per String.Split() in die Argumente gesplittet und in einem Array gespeichert
    - Output-Zeile wird neu zusammengestellt, am besten über String.Format
    - Output-Zeile schreiben
    - am Ende der Schleife streamWriter, streamReader sauber schliessen
    - wenn gewünscht InputFile löschen und die neue Datei umbenennen mit den Funktionen IO.File.Delete, IO.File.Move

    Da es Dein erster Beitrag ist, ausnahmsweise ein Code-Besipiel

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' fileNameIn ermitteln, hier im Beispiel nicht per OpenFileDialog
    2. Dim fileNameIn As String = "d:\test.txt"
    3. Dim fileNameOut As String = fileNameIn & ".extended"
    4. ' streamReader, streamWriter definieren und öffnen
    5. Dim reader As New IO.StreamReader(fileNameIn)
    6. Dim writer As New IO.StreamWriter(fileNameOut, False)
    7. ' zeilenweise lesen
    8. While reader.Peek <> -1
    9. ' zeile lesen: Vorname;Nachname;Alter;Wohnort;HTML
    10. Dim lineIn As String = reader.ReadLine
    11. ' in ein array splitten:
    12. Dim args() As String = lineIn.Split(";"c)
    13. ' neue Zeile ergänzen und schreiben
    14. Dim lineOut As String = String.Format("{0};{1};{2};{3};<h1>{0}</h1><h2>{1}</h2><strong>{2}</strong><h3>{3}</h3>", args(0), args(1), args(2), args(3))
    15. writer.WriteLine(lineOut)
    16. End While
    17. ' reader und writer sauber schliessen
    18. reader.Close()
    19. writer.Close()
    20. ' falls gewünscht weitere File Operationen zum löschen der alten und umbenennen der neuen Datei
    21. IO.File.Delete(fileNameIn)
    22. IO.File.Move(fileNameOut, fileNameIn)

    Du bist ein Schatz :)
    Ich werde das nachher gleich mal ausprobieren und weiter tüfteln. Wenn man erstmal einen Schnipsel Code sehen kann,
    dann fängt man auch an, das Ganze ein wenig mehr zu verstehen und nachvollziehen zu können.
    Ich meld mich dann zurück ;) DANKE!
    Ok, also im Prinzip funktioniert es schon einmal. Ich habe die Formatierungen aus verschiedenen Textboxen geholt und in Strings geschrieben,
    damit die Formatierungen auch in der Anwendung geändert werden können.

    Einziges Problem, welches ich gerade festgestellt habe:
    Die importierte CSV beinhaltet Umlaute, die beim Exportieren als unlesbare Zeichen dargestellt werden.
    Gibt es hierfür eine Möglichkeit, dem vorzubeugen (muss Zeichensatz/Format irgendwo mit rein)?

    Sobald alles passt, kann ich den fertigen Code natürlich posten, damit auch andere was davon haben. :)

    Phenom schrieb:

    Die importierte CSV beinhaltet Umlaute, die beim Exportieren als unlesbare Zeichen dargestellt werden.

    Dann liegt es an einem Encoding Problem, wie Du schon vermutet hast.

    Insofern gehe ich davon aus, daß Deine Original-CSV in ANSI vorliegt, also im Standard iso-8859-1 für west-europäische Sprachen.

    Entweder Du exportierst Deine Excel-Tabelle als Unicode UTF8, oder Du verwendest folgenden Code zum Einlesen:

    VB.NET-Quellcode

    1. Dim reader As New IO.StreamReader(fileNameIn, System.Text.Encoding.GetEncoding("iso-8859-1"))


    Im Beispiel wird die geänderte Datei als Unicode ausgegeben, sollte das bei der Weiterverwendung Probleme bereiten, so musst Du auch hier ein anderes Encoding verwenden.
    Leider komme ich erst jetzt dazu, an meinem Projekt weiterzuarbeiten.
    Ich habe das Ganze nun noch weiter bearbeitet, komme aber zu einem Problem, das ich nicht wirklich beheben kann.

    Wenn ich die jeweiligen HTML-Inhalte aus einer Textbox in einen String schreibe zum Beispiel:

    Quellcode

    1. dim tpl1 as string = textbox1.text


    und der Inhalt der Textbox ein Anführungszeichen beinhaltet (<div id="bla">)

    Ich dann mit deinem Code zum Beispiel den hier versuche:

    Quellcode

    1. Dim lineOut As String = String.Format("{0};{1};{2};{3};" & tpl1 & "{0}</h1><h2>{1}</h2><strong>{2}</strong><h3>{3}</h3>", args(0), args(1), args(2), args(3))


    Dann haut die ganze Sache nicht mehr hin...
    Wenn in der Textbox nur Text verwendet wird, gibts keine Probleme.
    Ich habe leider keine Ahnung, wie ich hier alternativ vorgehen könnte...
    8|

    Jemand einen Lösungsvorschlag? Ich will nicht dumm sterben.
    :)
    Haha...ich hab es lösen können :thumbsup:
    Die Anführungszeichen in der Textbox waren kein Problem. Allerdings war im definierten <head> ein Style-Block mit Sonderzeichen /**/ und das produzierte Fehler.
    Ich hab dann einfach den Style-Block entfernt und im <body> die Styles direkt zugewiesen, schon funktioniert das Ganze.

    Damit bei Excel auch richtig eingelesen werden kann und Umlaute richtig dargestellt werden, hat der Writer dann noch das richtige Encoding erhalten:

    VB.NET-Quellcode

    1. Dim writer As New IO.StreamWriter(fileNameOut, False, System.Text.Encoding.UTF8)


    Jetzt funktioniert es soweit schonmal.
    Danke nochmal an Kangaroo.
    :)