Listarray溢出

时间:2018-06-06 21:37:59

标签: c# csv

我在从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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

不确定为什么会被注释掉:

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;
    }
}

答案 1 :(得分:-1)

您的代码很难猜出错误来自于读取文件或文件内容本身。

您可以使用File.ReadAllLines方法获取文件路径并将其行作为数组返回,而不管您在foor循环中指定的行数,顺便说一下,如果行数可能会导致错误是不等于8000。

if (file.ShowDialog() == DialogResult.OK)
{
    try
    {
        gpsGGA.Clear();
        gpsRMC.Clear();
        string[] lines= File.ReadAllLines(file.FileName);
        foreach(String line in lines)
        {
           string[] substring = line.Split(';');
           gpsGGA.Add(substring[11]);
           gpsRMC.Add(substring[12]);
        }


    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

索引超出范围可能是由于某些行具有无效数据

例如,这是第6000行:sdd; dfdf; dfdf; 00; dfdf; 555

当您尝试在索引11或12处获取元素时,它不存在,因为此行只有6个元素