Javiertxl Ответов: 1

Как считывать данные из нескольких 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]);
        }
    }
}

Я довольно плохо программирую, был бы признателен, если бы кто-нибудь мог мне в этом помочь.

Спасибо.

1 Ответов

Рейтинг:
4

Richard MacCutchan

Потому что для каждого прочитанного файла вы создаете новые списки lX и lY Затем вы устанавливаете их в качестве DataSource для вашего ComboBoxисп.. Таким образом, когда вы выходите из цикла, только последние два списка будут установлены в качестве источников ComboBoxисп.. Вам нужно создать списки вне вашего цикла, а затем добавить каждый элемент из каждого файла в списки. Затем вы добавляете их к ComboBoxes после того, как все данные были прочитаны.


Javiertxl

Да, другой парень указал мне на это в stackoverflow. Теперь мне удалось прочитать несколько csv-файлов в график.

Могу ли я узнать, как я мог бы создать легенды сбоку для различных файлов, которые я открыл?

Richard MacCutchan

Извините, понятия не имею. Я бы предложил проверить документацию для класса Chart, с которым вы работаете.