Как считывать данные из нескольких CSV-файлов в линейный график
В настоящее время мой код может выбрать несколько csv-файлов с помощью
OpenFileDialog
и MultiSelect = True
Но мой график, похоже, получает данные только из одного csv-файла, а не из других. Все мои csv-файлы имеют только 2 столбца (оси X и Y):
Entropy Values,File Offset 5.55675,1024 5.3757,1536 5.68973,2048 ...
Мне нужно иметь возможность получать данные из нескольких csv-файлов и получать график с несколькими строками (например, 3 csv-файла = 3 строки, показанные на графике).
Что я уже пробовал:
В настоящее время мой код выглядит следующим образом:
GraphDemo. cs
private void openToolStripMenuItem_Click(object sender, EventArgs e) { Stream myStream = null; OpenFileDialog ff = new OpenFileDialog(); ff.InitialDirectory = "C:\\"; ff.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*"; ff.Multiselect = true; ff.FilterIndex = 1; ff.RestoreDirectory = true; if (ff.ShowDialog() == DialogResult.OK) { try { foreach (String file in ff.FileNames) { myStream = File.OpenRead(file); rr = null; rr = new Read(myStream); string[] header = rr.get_Header(); List<string> lX = new List<string>(); List<string> lY = new List<string>(); for (int i = 0; i < header.Length; i++) { lX.Add(header[i]); lY.Add(header[i]); } //Populate the ComboBoxes xBox.DataSource = lX; yBox.DataSource = lY; // Close the stream myStream.Close(); } } catch (Exception err) { //Inform the user if we can't read the file MessageBox.Show(err.Message); } } }
Read. cs
class Read { private string[] header; private float[,] data; private int nLines; private int nColumns; public Read(Stream myStream) { string aux; string[] pieces; //read the file line by line StreamReader sr = new StreamReader(myStream); aux = sr.ReadLine(); header = aux.Split(','); nColumns = header.Length; nLines = 0; while ((aux = sr.ReadLine()) != null) { if (aux.Length > 0) nLines++; } //read the numerical data from file in an array data = new float[nLines, nColumns]; sr.BaseStream.Seek(0, 0); sr.ReadLine(); for (int i = 0; i < nLines; i++) { aux = sr.ReadLine(); pieces = aux.Split(','); for (int j = 0; j < nColumns; j++) { data[i, j] = float.Parse(pieces[j]); } } sr.Close(); }
Сюжет. cs
class Plot { public Plot(Read rr, ComboBox xBox, ComboBox yBox, Chart chart) { int indX = xBox.SelectedIndex; int indY = yBox.SelectedIndex; float[,] data = rr.get_Data(); int nLines = rr.get_nLines(); int nColumns = rr.get_nColumns(); string []header = rr.get_Header(); chart.Series.Clear(); //ensure that the chart is empty chart.Series.Add("Series0"); chart.Series[0].ChartType = SeriesChartType.Line; chart.ChartAreas[0].AxisX.LabelStyle.Format = "{F2}"; chart.ChartAreas[0].AxisX.Title = header[indX]; chart.ChartAreas[0].AxisY.Title = header[indY]; chart.Legends.Clear(); for (int j = 0; j < nLines; j++) { chart.Series[0].Points.AddXY(data[j, indX], data[j, indY]); } } }
Я довольно плохо программирую, был бы признателен, если бы кто-нибудь мог мне в этом помочь.
Спасибо.