Projekt Read CSV Advanced

Es können beliebige csv-Dateien eingelesen werden.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// BIBLIOTHEK
using System.IO;
 
using System.Net;  //Für Webzugriff
 
namespace _5_ReadChart  //Namensraum
{
    public partial class Form1 : Form   //Vererbte Klasse Form1, abgeleitet von Form
    {
 
        string[] lines;
        string[] columns;
        char separator = ';';
 
        public Form1()
        {
            InitializeComponent();
 
            using (var client = new WebClient())
            {
                //Download der aktuellsten Daten vom Coronavirus
               client.DownloadFile("https://covid.ourworldindata.org/data/ecdc/full_data.csv","fullCoronaData.csv")  ;
            };
        }
 
        private void tb_Pfad_MouseClick(object sender, MouseEventArgs e)
        {
            openFileDialog1.Filter = "csv-Files (*.csv)|*.csv|Text-Files (*.txt)|*.txt|Alles|*.*";
            // Prüfen, ob das Öffnen und das Auswählen einer Datei funktioniert hat
            if ( openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                tb_Pfad.Text = openFileDialog1.FileName;
            }
        }
 
        private void bt_readCSVData_Click(object sender, EventArgs e)
        {
            //Read all Lines
 
 
 
 
            //Alle Zeilen einlesen
            lines=File.ReadAllLines(tb_Pfad.Text);
 
            Console.WriteLine(lines[0]);
            Console.WriteLine(lines[2]);
 
            //columns = lines[1].Split(';');
 
            //Überprüfung, ob Datei ausgewählt wurde und ein Pfad in TextBox
            //bzw. ob ein Separator angegeben wurde.
           if(tb_Pfad.Text.Length>0 && tb_separator.Text.Length==1)
            {
                Console.WriteLine("Textbox und Separator nicht leer.");
                separator = tb_separator.Text[0];  //Einzelnes Zeichen in die Variable separator speichern
 
                //Extrahieren der Spalten (=Überschriften) von der ersten Zeile
                columns = lines[0].Split(separator);  //mehrere Spaltennamen im Array 0 ... 3 --> colums.Length ->4
 
                //Vor dem Hinzufügen der Items in die ComboBox muss die ComboBox geleert werden
                cb_FilterColumn.Items.Clear();
                cb_xAxis.Items.Clear();
                cb_yAxis.Items.Clear();
 
                //Befüllen der Combo-Box mit den Überschriften der Spalten
                for (int i=0;i<columns.Length;i++)
                {
                    Console.WriteLine(columns[i]);
                    cb_FilterColumn.Items.Add(columns[i]);
                    cb_xAxis.Items.Add(columns[i]);
                    cb_yAxis.Items.Add(columns[i]);
                }
            }       
        }
 
        private void cb_location_SelectedValueChanged(object sender, EventArgs e)
        {
 
        }
 
        private void cb_FilterColumn_SelectedIndexChanged(object sender, EventArgs e)
        {
            Console.WriteLine("Eine Filter Column wurde ausgewählt!");
 
 
 
            //Leeren der ComboBox vor jeder Auswahl
            cb_FilterText.Items.Clear();
 
            //Sobald die Spalte ausgewählt wurde, sollen die Werte dieser Spalte in die ComboBox Filter-Text geladen werden.
            for(int i=1;i<lines.Length;i++)
            {
                Console.WriteLine(lines[i]);
 
                //Zeile wird gesplitted und in columns geschrieben
                columns = lines[i].Split(separator);
 
                //Die vom User ausgewählte Spalte wird ausgegeben
                Console.WriteLine(columns[cb_FilterColumn.SelectedIndex]);
 
                //Überprüfung ob der Wert bereits in der ComboBox enthalten ist
                if (cb_FilterText.Items.Contains(columns[cb_FilterColumn.SelectedIndex]) == false)
                {
                    //Die vom User ausgewählte Spalte wird in die Combo Box Filter Text geschrieben
                    cb_FilterText.Items.Add(columns[cb_FilterColumn.SelectedIndex]);
                }
            }
        }
 
        private void cb_xAxis_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cb_xAxis.SelectedIndex>=0)
            {
                int columnindex = 0;
            }
        }
 
        //Aktion, wenn eine Spalte bei Select Data xAxis ausgewählt wurde
        private void cb_xAxis_SelectionChangeCommitted(object sender, EventArgs e)
        {
             Console.WriteLine("Spalte für die x-Achse wurde ausgewählt");
            //Bis jetzt wurden die Spalten im DataGrid händisch hinzugefügt, jetzt während der Laufzeit
 
            string coltext = cb_xAxis.SelectedItem.ToString();
            string colname = cb_xAxis.SelectedItem.ToString();   // kommt aus der ComboBox
            Console.WriteLine(colname);
 
            //Ersetzen von Leerzeichen und Bindestrichen, da diese für den Spaltennamen nicht verwendbar sind.
            colname = colname.Replace(' ', '_');  //Leerzeichen mit Unterstrich ersetzt
            colname = colname.Replace('-', '_'); //Bindestriche mit Unterstrich ersetzt
 
 
            //Überprüfe, ob bereits Spalten hinzugefügt wurden:
            if(dataGridView1.Columns.Count ==0)
            {
                //Noch keine Spalte vorhanden
                //Hinzufügen der Spalte: Verlangt Namen und Headertext
                dataGridView1.Columns.Add(colname, coltext);
            }
            else  //Falls bereits Spalten existieren, ersetze die erste Spalte mit der neuen ausgewählten Spalte
            {
                //Kein Add möglich, daher Name und Headertext ersetzen
                dataGridView1.Columns[0].Name = colname;
                dataGridView1.Columns[0].HeaderText = coltext;
 
            }
            //Aufruf der Funktion für das Befüllen des DataGrids und Chart
            FillGridAndChartWithData();
 
        }
        //Aktion, wenn eine Spalte bei Select Data xAxis ausgewählt wurde
        private void cb_yAxis_SelectionChangeCommitted(object sender, EventArgs e)
        {
            Console.WriteLine("Spalte für die y-Achse wurde ausgewählt");
            //Bis jetzt wurden die Spalten im DataGrid händisch hinzugefügt, jetzt während der Laufzeit
 
            string coltext = cb_yAxis.SelectedItem.ToString();
            string colname = cb_yAxis.SelectedItem.ToString();   // kommt aus der ComboBox
            Console.WriteLine(colname);
 
            //Ersetzen von Leerzeichen und Bindestrichen, da diese für den Spaltennamen nicht verwendbar sind.
            colname = colname.Replace(' ', '_');  //Leerzeichen mit Unterstrich ersetzt
            colname = colname.Replace('-', '_'); //Bindestriche mit Unterstrich ersetzt
 
 
            //Überprüfe, ob bereits Spalten hinzugefügt wurden:
            if (dataGridView1.Columns.Count == 1)
            {
                //Noch keine Spalte vorhanden
                //Hinzufügen der Spalte: Verlangt Namen und Headertext
                dataGridView1.Columns.Add(colname, coltext);
            }
            else if(dataGridView1.Columns.Count >= 1) //Falls bereits Spalten existieren, ersetze die erste Spalte mit der neuen ausgewählten Spalte
            {
                //Kein Add möglich, daher Name und Headertext ersetzen
                dataGridView1.Columns[1].Name = colname;
                dataGridView1.Columns[1].HeaderText = coltext;
            }
 
            //Aufruf der Funktion für das Befüllen des DataGrids und Chart   
            FillGridAndChartWithData();
 
        }
 
 
        public void FillGridAndChartWithData()
        {
            //Optionale Einstellungen für das Chart 
 
            chart1.ChartAreas[0].AxisX.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dot;
            chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
            chart1.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
            chart1.ChartAreas[0].CursorX.IsUserEnabled = true;
            chart1.ChartAreas[0].CursorY.IsUserEnabled = true;
            chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
            chart1.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
            chart1.ChartAreas[0].AxisX.LabelStyle.Angle = -90;
 
            chart1.ChartAreas[0].AxisY.MinorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dot;
            chart1.ChartAreas[0].AxisY.MinorGrid.Enabled = true;
 
 
        //Falls x-Achse, y-Achse und Filter ausgewählt wurden, dann rufe die Funktion FillGridAndChartWithData() auf
            if (dataGridView1.Columns.Count == 2 && cb_FilterText.SelectedIndex >= 0)
            {
                Console.WriteLine("Befülle Grid");
 
                //Grid und Chart leeren
                dataGridView1.Rows.Clear();
                chart1.Series[0].Points.Clear();
 
                //Name der Legende ändern
                chart1.Series[0].Name = cb_FilterText.Text;
 
                //Achsen beschriften
                chart1.ChartAreas[0].AxisX.Title = cb_xAxis.SelectedIndex.ToString();     //kann es aus Combobox herausholen
                chart1.ChartAreas[0].AxisY.Title = dataGridView1.Columns[1].HeaderText;   //oder auch aus dem DataGrid
 
 
                string xwert = "";
                string ywert = "";
 
                //Zeilenweise durchgehen
                for(int i=1; i<lines.Length;i++)
                {
                    //Console.WriteLine(lines[i]);
                    //Extrahieren der Spalten jeder Zeile
                    columns = lines[i].Split(separator);
 
                    //Auswahl der x-Werte und y-Werte
 
                    xwert = columns[cb_xAxis.SelectedIndex];    //Index der ComboBox stimmt überein mit Stelle von CSV-Datei bzw. Array columns
                    ywert = columns[cb_yAxis.SelectedIndex];
 
                    //Überprüfen, ob der ausgewählte Filter mit dem CSV-Zeileneintrag übereinstimmt
                    //   Console.WriteLine(cb_FilterText.Text);
                    //   Console.WriteLine(columns[cb_FilterColumn.SelectedIndex]);
                    if (cb_FilterText.Text == columns[cb_FilterColumn.SelectedIndex])
                    {
                        Console.WriteLine("x-Wert: " + xwert + " y-Wert: " + ywert);
                        dataGridView1.Rows.Add(xwert, ywert);
                        chart1.Series[0].Points.AddXY(xwert, ywert);
                    }
                }
            }
        }
 
        //Aktion, wenn ein Item aus der ComBoBox Filtertext ausgewählt wurde
        private void cb_FilterText_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //Aufruf der Funktion für das Befüllen des DataGrids und Chart
            FillGridAndChartWithData();
 
        }
    }
}