首页 > 解决方案 > 列表数组溢出

问题描述

我从 CSV 文件读取数据时遇到问题。如下例所示,我尝试从两个不同的列中读取列表信息。使用查询“EndOfStream”或使用大于约 6000 的计数变量时,我得到错误:“索引超出范围”。但是,计数变量为 4000 时,代码完全可以正常工作。我不明白我的错误。

List<string> gpsGGA = new List<string>();
List<string> gpsRMC = new List<string>();

public Form1()
{
    InitializeComponent();
}

private void btn_file_Click(object sender, EventArgs e)
{
    string path;
    OpenFileDialog file = new OpenFileDialog();
    if (file.ShowDialog() == DialogResult.OK)
    {
        try { 
            path = file.FileName;
            StreamReader data = new StreamReader(path);
            data.ReadLine();                                        //Header verwerfen
            gpsGGA.Clear();
            gpsRMC.Clear();
            for(int i=0; i<8000; i++)//while (!data.EndOfStream)
            {
                string[] substring = data.ReadLine().Split(';');
                gpsGGA.Add(substring[11]);
                gpsRMC.Add(substring[12]);
            }
            data.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

标签: c#csv

解决方案


不知道为什么这被注释掉了:

for(int i=0; i<8000; i++)//while (!data.EndOfStream)

被注释掉的 while 循环旨在仅在存在时读取数据。

我添加了一个 using 语句来确保文件被关闭。我添加了 IsNullOrEmpty 检查以防文件末尾有空行,因此您不会收到错误消息。

using (StreamReader data = new StreamReader(path))
{

    data.ReadLine();                                        //Header verwerfen
    gpsGGA.Clear();
    gpsRMC.Clear();
    int counter = 0;
    while (!data.EndOfStream)
    {
        string line = data.ReadLine();
        if (! String.IsNullOrEmpty(line))
        {
            string[] substring = line.Split(';');
            if ( substring.Length < 13 )
                 throw new ApplicationException("Malformated Data At Line " + counter.ToString());
            gpsGGA.Add(substring[11]);
            gpsRMC.Add(substring[12]);
        }
        counter += 1;
    }
}

推荐阅读