我在从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);
}
}
}
答案 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个元素