Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Eine Liste aus einer CSV-Datei erstellen
lschwarz
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

Eine Liste aus einer CSV-Datei erstellen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

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ß
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von vbprogger am .
Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15671
Herkunft: BW

beantworten | zitieren | melden

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

Jedoch: untypisierte Arrays sind definitiv veraltet.
private Nachricht | Beiträge des Benutzers
Yeats
myCSharp.de - Member



Dabei seit:
Beiträge: 97
Herkunft: Österreich

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
lschwarz
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers