c# - 列表数组溢出
问题描述
我从 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);
}
}
}
解决方案
不知道为什么这被注释掉了:
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;
}
}
推荐阅读
- windows - Bash脚本转换成批处理
- java - schemaspy:我不明白如何将它与 SQLite 一起使用
- doxygen - 有没有办法在函数/子例程“详细信息”之前显示调用/调用者图?
- python-3.x - 带有 cx_oracle 的上下文管理器并将 SQL 传递给函数
- vba - 如何从 VBA 调用 IFileOpenDialog.Show()
- c++ - 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- nlp - Spacy:自动在文本中查找引理模式
- c# - 在 .NET Core 类构造函数中注入接口的所有实现者
- python - 输入列表 Python 的列表(例如 input() [[1,2,3],[4,5,6]])
- kubernetes - 在 Kubernetes 集群上使用 Jmeter GUI 运行 Perf 测试