Laden...

Eine Liste aus einer CSV-Datei erstellen

Erstellt von lschwarz vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.934 Views
L
lschwarz Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren
Eine Liste aus einer CSV-Datei erstellen

Hallo zusammen,

ich bin neu hier und fange dieses Jahr mein Studium an und möchte mir schonmal ein Paar Grundlagen in der Programmierung aneignen. Ich habe eine CSV-Datei, in der alle Haltestellen der deutschen Bahn gespeichert sind. Nach folgendem Schema:


EVA_NR;DS100;IFOPT;NAME;VERKEHR;LAENGE;BREITE;STATUS
8000001;KA;de:05334:1008;Aachen Hbf;FV;6,09149900;50,7678000;
8000002;TA;de:08136:1000;Aalen Hbf;FV;10,0962710;48,8410130;
8000004;HA;de:05774:7131;Altenbeken;FV;8,94331900;51,7664330;

Ich möchte gerne die einzelnen Zeilen auslesen und dann über ListBoxItems in einer ListBox in WPF ausgeben. Soweit so gut. Ich habe dazu eine eigene Klasse Bahnhof erstellt. Die sieht folgendermaßen aus:


class Bahnhof
    {
        int id;
        string name;
        string länge;
        string breite;

        public int Id { get { return id; } }
        public string Name { get { return name; } }

        public Bahnhof(int id, string name)
        {
            this.id = id;
            this.name = name;
        }

    }

Und der Code der MainWindow-Klasse folgendermaßen:


public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonLade_Click(object sender, RoutedEventArgs e)
        {
            Bahnhof[] bahnhöfe;
            ListBoxItem[] lbi;

            OpenFileDialog ofd = new OpenFileDialog();
            if(ofd.ShowDialog() == true)
            {
                string dateiname = ofd.FileName;
                string[] zeilen = File.ReadAllLines(dateiname);

                bahnhöfe = new Bahnhof[zeilen.Length - 1];
                lbi = new ListBoxItem[zeilen.Length - 1];
                

                for (int i = 1; i < zeilen.Length; i++)
                {
                    string[] teile = zeilen[i].Split(';');
                    bahnhöfe[i] = new Bahnhof(int.Parse(teile[0]), teile[1]);
                    lbi[i] = new ListBoxItem();
                    lbi[i].Content = bahnhöfe[i].Id + bahnhöfe[i].Name;
                    ListBox1.Items.Add(lbi[i]);
                }
            }
        }
    }


Leider erhalte ich eine Exception: System.IndexOutOfRangeException. Nachricht = Der Index war außerhalb des Arraybereichs.

Die GUI möchte ich noch sehr schlicht halten, und beschränke mich daher auf einen Button "Lade" und eine Listbox für die Anzeige der Items.

Ich bedanke mich jetzt schon für eure Hilfe!

Viele Grüße
Luca

S
322 Beiträge seit 2007
vor 5 Jahren

Hallo, solche Fehler findest Du am besten heraus wenn du den Debugger verwendest, siehe [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Ich vermute dass in der CSV-Datei eine leere Zeile existiert...

1.696 Beiträge seit 2006
vor 5 Jahren

Ist doch klar. Bei Array fängt der Index immer bei 0 an, du allokierst ein Array der länge (lenght-1), d.h. der Index läuft con 0 bis (length-2), deine for-schleife läuft aber bis (length-1) und somit out of range.

Andererseits, Array ist veraltet, nimm List<> dann ist es einfacher, zB:

List<Bahnhof> Trainstation = new List<Bahnhof>();
....
....
// neues Element hinzufügen:

Trainstation.Add(new Bahnhof(...,...));

// Bahnhof ansprechen:

... Trainstation[i].Id ...
... Trainstation[i].Name ...

Du brauchst also keine 2 Arrays.

Gruß

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

16.806 Beiträge seit 2008
vor 5 Jahren

Typisierte Arrays sind nicht veraltet, aber Listen sind moderner und einfacher.
Listen basieren auf Arrays.

Jedoch: untypisierte Arrays sind definitiv veraltet.

Y
102 Beiträge seit 2005
vor 5 Jahren

Wenn du mit WPF arbeitest, sieh dir auch das MVVM Pattern und versuche dich daran zu halten. Es macht einiges einfacher --> Bessere Trennung deiner Logik von deiner UI --> leichteres schreiben von UnitTests

L
lschwarz Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

Hallo,

vielen Dank für alle Antworten. Der Fehler lag tatsächlich daran, dass die For-Schleife versucht hat, einen Bereich zu ändern, der nicht verfügbar war. Dies konnte ich lösen. Für künftige Projekte werde ich mir Listen anschauen und auch das MVVM Pattern.

Viele Grüße