Laden...

[BEANTWORTET] .csv Items in ListView auslesen

Erstellt von Cizzl vor 7 Jahren Letzter Beitrag vor 7 Jahren 6.033 Views
C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren
[BEANTWORTET] .csv Items in ListView auslesen

Hallo,
ich brauche eure Hilfe.

Ich habe eine ListView die mit einem bestimmten Pfad verknüpft ist, die Dateinamen laden und anzeigen soll. Wenn man eine .csv Datei auswählt muss der Inhalt in einer anderen Listview eingefügt werden.
Es geht darum wenn ich eine Datei in meiner ListView auswähle möchte ich das der Inhalt auf eine andere Listview angezeigt wird (Dabei handelt es sich in der ersten ListView um keine eingetragenen Dateien, sondern mit einem Pfad ausgelesene Dateien. Bei einem Klick auf eine der angezeigten Dateien soll sich der Inhalt der .csv Datei in eine ListView eintragen.)
Bitte nur in C# antworten, da ich momentan noch keine andere Sprache beherrsche.

LG Marcel

P.s: (Windows Forms)

3.003 Beiträge seit 2006
vor 7 Jahren

Bitte nur in C# antworten, da ich momentan noch keine andere Sprache beherrsche.

Ich hoffe, Deutsch ist auch okay 😉.

Kurze Nachfrage: was hast du denn probiert, und woran scheitern deine Versuche?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Hi LaTino,
Klar xD, es geht auch Englisch und Französisch. 👅

Ich habe eine ListView die mir verschiedene .csv Dateien anzeigt. Wenn ich eine der Dateien anklicke soll sich der Inhalt der ausgewählten Datei öffnen. Daran scheitert es, ich weis nicht wie ich mit dem StreamReader immer ein anderen Pfad auswählen kann und mir der Inhalt der .csv Datei angezeigt wird.

LG Marcel

2.298 Beiträge seit 2010
vor 7 Jahren

Bleiben wir beim ersten Teil von LaTino's Frage: Was hast du bisher probiert?

// EDIT: Schaffst du es denn schon, eine CSV-Datei einzulesen?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Hi inflames2k,
ich habe bereits probiert durch das Clickevent meiner ListView eine foreach Schleife zu erstellen und den Filenamen und Pfad auszulesen.


private void FileView_SelectedIndexChanged(object sender, EventArgs e)
        {
                string line;
            foreach (string filename in Directory.GetFiles(@"Z:\", "*.csv*"))
            {
                string path = Path.GetFileName(@"Z:\", "*.csv*");

            }
                    using (StreamReader file = new StreamReader(path,Encoding.UTF8))
                    {
                        int count = 0;
                        int summe = 0;
                        while ((line = file.ReadLine()) != null)
                        {
                            string[] csvItems = line.Split(new char[] { ';' });
                            count++;

                            if (count == 1)
                            {
                           
                            }


                            int name;
                            if (int.TryParse(csvItems[0], out name))
                            {
                                Name = name;
                            }

                            DateTime date;
                            if (DateTime.TryParse(csvItems[1], out date))
                            {
                                Date1 = date;
                            }

                            int stacks;
                            if (int.TryParse(csvItems[8], out stacks))
                            {
                                Stacks = stacks;
                                summe += Stacks;
                            }
                }
            }
        }

LG Marcel

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

// EDIT: Schaffst du es denn schon, eine CSV-Datei einzulesen?

Ja, das habe ich bereits geschafft.

2.298 Beiträge seit 2010
vor 7 Jahren

Wozu die Pfad-Ermittlung zu Beginn der Methode? Ich dachte, du hast die Pfade bereits und möchtest eine spezielle CSV-Datei einlesen?

Korrekter wäre doch hier, das geklickte ListView-Item zu verwenden.


string path = myListView.SelectedItems[0].Text;

Auch halte ich es für unglücklich, ein ListView für die Ausgabe der CSV-Datei zu verwenden. Bietet sich hier nicht eher ein DataGridView an? Vorteil: Du kannst aus den Zeilen deiner CSV Objekte oder DataRows erstellen und eine Collection/DataTable direkt an das DataGridView binden.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

185 Beiträge seit 2005
vor 7 Jahren

In einem CSV kann aber auch im Text ein ";" vorkommen, dann funktioniert dein Einlesen nicht mehr richtig.

Nimm zum Einlesen besser den TextFieldParser. Dazu must du mit using Microsoft.VisualBasic.FileIO mit einbinden.
Dann kannst du auch ganz einfach auf die Daten zugreifen.

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Wozu die Pfad-Ermittlung zu Beginn der Methode? Ich dachte, du hast die Pfade bereits und möchtest eine spezielle CSV-Datei einlesen?

Die Pfad Ermittlung wird benötigt, da mindestens einmal im Monat eine neue Datei hinzugefügt wird und diese dann automatisch in der Liste eingetragen werden sollen.

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

In einem CSV kann aber auch im Text ein ";" vorkommen, dann funktioniert dein Einlesen nicht mehr richtig.

Nein, in meinem File gibt es nur Dateien die durch eine andere Software immer mit einen ";" getrennt werden. Es ist zu 100% sicher, dass dadurch keine Fehler auftreten.
Trotzdem danke! 🙂

2.298 Beiträge seit 2010
vor 7 Jahren

Die Pfad Ermittlung wird benötigt, da mindestens einmal im Monat eine neue Datei hinzugefügt wird und diese dann automatisch in der Liste eingetragen werden sollen.

Das tust du aber an der Stelle garnicht und hat an der Stelle auch garnichts verloren. Die Ermittlung der vorhandenen CSV-Dateien gehört nicht zu der Funktion zum Anzeigen der Daten aus einer gewählten CSV-Datei.

Korrekt wäre hier:1.Ermittlung der CSV-Dateien im angegebenen Ordner (Wenn das wirklich so ganz wichtig ist, dann mit einem Timer zyklisch einlesen, ansonsten bei Button-Click). 1.Bei Auswahl einer CSV-Datei: Lesen genau dieser Datei und Anzeige der Daten

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

D
985 Beiträge seit 2014
vor 7 Jahren

Es ist zu 100% sicher, dass dadurch keine Fehler auftreten.

Zu 100% sicher ist nur, dass es zu einem Zeitpunkt x passieren wird 😁

Schau dir mal FileHelpers.Net an.

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren
 using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))
path: FileView.SelectedItems

Kann ich das irgendwie mit einer Variable zuweisen? Das ist im Moment das einzige Problem das ich habe.

Vielen Dank!
LG Marcel

3.003 Beiträge seit 2006
vor 7 Jahren

Ich habe jetzt eine Weile hin und her überlegt, wie man's am besten erklärt. Die Sache von dem, was man deinem geposteten Code entnehmen kann, ist die: viel zu aufwändig, unnötig komplex, nicht entkoppelt. Das könnten wir jetzt Stück für Stück auseinandernehmen und korrigieren, ich glaube aber, der Lerneffekt wäre minimal, und das Ergebnis auch nicht so pralle.

Daher anbei ein kleines Projekt, an dem du dich, wenn du willst, orientieren kannst. Zumindest die Grundprinzipien vom Parsen und der Trennung von Logik und Benutzeroberfläche mittels Databinding kannst du dir dort abschauen.

Vor dem Testen im Program.cs den Pfad eintragen, wo deine CSV liegen, oder ggf den Controller anpassen, wenn die Dateien verstreut auf der Platte sind.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

1.040 Beiträge seit 2007
vor 7 Jahren

Versuche bitte die beiden Schritte - Einlesen der CSV-Liste und Einlesen einer CSV-Datei - gedanklich und codeseitig zu trennen.

Der erste Schritt ist das Einlesen der CSV-Liste. In diese Liste packst du die Pfade zu den CSV-Dateien.

Der zweite Schritt ist das Einlesen einer CSV-Datei. Hier nutzt du schon richtigerweise das SelectedIndexChanged-Event. Mit diesem Index kannst du auf deine Liste zugreifen und den Pfad auslesen, den du dann im StreamReader nutzt.

Das Problem dass du momentan hast, ist eher, dass du die beiden Aufgaben vermischt. =)

EDIT: Und den Post von LaTino berücksichtigen. 😉

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Danke, ich werde es ausprobieren 😄

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Versuche bitte die beiden Schritte - Einlesen der CSV-Liste und Einlesen einer CSV-Datei - gedanklich und codeseitig zu trennen.

Der erste Schritt ist das Einlesen der CSV-Liste. In diese Liste packst du die Pfade zu den CSV-Dateien.

Der zweite Schritt ist das Einlesen einer CSV-Datei. Hier nutzt du schon richtigerweise das SelectedIndexChanged-Event. Mit diesem Index kannst du auf deine Liste zugreifen und den Pfad auslesen, den du dann im StreamReader nutzt.

Das Problem dass du momentan hast, ist eher, dass du die beiden Aufgaben vermischt. =)

EDIT: Und den Post von LaTino berücksichtigen. 😉

Ok, ich werde es mal probieren Themenweisen zu trennen.

(Wäre es hilfreich, wenn ich den kompletten Code posten würde?)

LG Marcel

3.003 Beiträge seit 2006
vor 7 Jahren

Wenn wirklich während der Laufzeit des Programms neue Dateien dazukommen können, kannst du im Controller einfach einen FileSystemWatcher o.ä. verbauen und entsprechend die Liste der Dateien neu aufbauen. Wenn einmal im Monat da was dazukommt, halte ich das aber für Usninn.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

2.298 Beiträge seit 2010
vor 7 Jahren

Hallo,

auch ich hatte eben ein kleines Beispielprojekt angelegt wie ich das angehen würde. Das findest du im Anhang.

Bei mir ist das Beispiel denke ich noch etwas minimaler und Fehleranfälliger als bei LaTino.

Nach Eingabe eines Pfads werden in meinem Beispiel durch Button-Click alle CSV-Dateien im Pfad ermittelt. Nach Auswahl einer Datei wird diese dann in einem DataGridView angezeigt.

Mein Beispiel setzt jedoch vorraus, dass in der ersten Zeile der CSV-Datei jeweils die Bezeichner für die einzelnen Werte stehen.

// EDIT: Das wichtigste in meinem Code ist ohnehin die Klasse CSVReader.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.003 Beiträge seit 2006
vor 7 Jahren

(Wäre es hilfreich, wenn ich den kompletten Code posten würde?)

Möglich. Ich für meinen Teil schalte geistig schon ab, wenn ich Programmlogik in den Ereignis-Methoden im Code-Behind der Form sehe. Hat da nix verloren; aber das meinte ich: ich sehe kein großes Potenzial darin, deinen vorhandenen Code Stückchen für Stückchen zu verbessern, weil da gleich mehrere Ansätze falsch sind. Ohne dir auf den Schlips treten zu wollen 😉.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren
 using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))  
path: FileView.SelectedItems  

Kann ich das irgendwie mit einer Variable zuweisen? Das ist im Moment das einzige Problem das ich habe.

//EDIT: Ich bekomme wenn ich das so verwende wie oben beschrieben die Fehlermeldung:

"Die Spezifikation für benannte Argumente müssen nach Angabe aller festen Argumente angezeigt werden." Fehlercode: CS1738

2.298 Beiträge seit 2010
vor 7 Jahren

Um das zu beantworten, müsste man deine Frage genau verstehen. Das tu ich aber tatsächlich nicht.

FileView.SelectedItems ist aus meiner Sicht auch ganz einfach mal nicht korrekt.

Was du willst sofern ich dich richtig verstehe ist:


string myPath = FileView.SelectedItems[0].Text;

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren

Um das zu beantworten, müsste man deine Frage genau verstehen. Das tu ich aber tatsächlich nicht.

FileView.SelectedItems ist aus meiner Sicht auch ganz einfach mal nicht korrekt.

Also: Es geht darum ich habe 2 ListViews, eine Links die andere Rechts platziert.
Die Linke ListView zeigt mir alle .csv Dateien an. (das funktioniert soweit)
Aber wenn ich auf eine der angezeigten Dateien klicke, sollte auf der rechten ListView der Inhalt der geklickten .csv Datei angezeigt werden, das funktioniert leider nicht. Man soll also durch ein Klick einer der Items den Inhalt öffnen können, diese wird dann in die rechte ListView eingetragen.

P.s: bin noch ein Anfänger, deshalb weis ich nicht wirklich wie manches funktioniert.

3.003 Beiträge seit 2006
vor 7 Jahren

Dein (linker) Listview sollte als DataSource eine Liste von Objekten haben. Gleichzeitig sollte seine Eigenschaft "SelectedValue" per Databinding an einer Eigenschaft eines steuernden Objekts gebunden sein. Das aktuell ausgewählte Objekt der Liste links entnimmst du dann eben jener gebundenen Eigenschaft. Das SelectedIndex-Gefuchtel solltest du ganz schnell wieder vergessen.

Was du machst:

"wenn der Benutzer HIER klickt, mache ich das. Ändert er DORT etwas, muss ich so reagieren."
Das ist nicht mehr zu verwalten, weil daraus früher oder später so etwas hier wird:
"wenn der Benutzer DORT klickt, vorher DAS da angehakt hat, in der Konfiguration im Wert XY etwas steht und die Venus im Schützen steht, DANN mach ich das" - kein Mensch inklusive dir selbst versteht dann noch, was da passiert.

Was du machen solltest:

"Form, deine Liste von CSV-Dateien steht da im Objekt 'Controller'. Und bitte das, was auch immer grad in dieser Liste ausgewählt ist, ebenfalls mit dem Objekt abgleichen. Danke."

Hier der komplette Code, der notwendig ist, um das aktuell ausgewählte Objekt zu identifzieren:


_fileListBox.DataBindings.Add("SelectedValue", _controller, "SelectedFile", false, DataSourceUpdateMode.OnPropertyChanged);

...und wenn du das stattdessen im Designer zusammenklickst, was auch geht, dann verschwindet sogar diese eine Zeile noch.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
Cizzl Themenstarter:in
51 Beiträge seit 2016
vor 7 Jahren
using (StreamReader file = new StreamReader(path: FileView.SelectedItems, Encoding.UTF8))

Welche Variable muss dann für den Pfad gegeben werden?

3.003 Beiträge seit 2006
vor 7 Jahren

Hast du mal in das Projekt geschaut, was ich gepostet habe? Werd' den StreamReader los.

LaTino
EDIT: in dem Fall oben hast du jederzeit auf Controller.SelectedFile.File zugriff, das vom Typ FileInfo ist. Folgender Schnippsel liefert dir dann also alle Zeilen bis auf die erste, die in der Datei stehen:


string[] allLines = File.ReadAllLines(controller.SelectedFile.File.FullName).Skip(1); //Skip: erste Zeile überspringen

Anwendung steht auch in MainController.cs, letzte Zeile. Da wird direkt geparst.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)