我编写了一个小程序来读取csv
文件中的数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace test
{
class Program
{
static void Main( string[] args )
{
var reader = new StreamReader( File.OpenRead( @"C:\Users\Desktop\Results.csv" ) );
List<string> listA = new List<string>();
List<string> listB = new List<string>();
while ( !reader.EndOfStream )
{
var line = reader.ReadLine();
var values = line.Split( ',' );
listA.Add( values[0] );
listB.Add( values[1] );
}
// Print column one.
Console.WriteLine( "Column 1:" );
foreach ( var element in listA )
Console.WriteLine( element );
// Print column two.
Console.WriteLine( "Column 2:" );
foreach ( var element in listB )
Console.WriteLine( element );
Console.ReadKey();
}
}
}
我在第listB.Add( values[1] );
行
Index was outside the bounds of the array.
当我评论与listB
有关的所有事情时,它会起作用,并向我显示第1列......
有人可以帮我理解我做错了吗?
谢谢,
答案 0 :(得分:2)
可能会发生此错误,因为读取的行后面没有“,”字符或文本。因此值[1]不存在并且错误被抛出。您可以使用
检查该案例if(values.length < 2)
{
//do what ever is needed in your case
}
或者确保您正在阅读的文件在每行上至少有2个以“,”分隔的值。像
这样的一行例如,的text1,
会导致该错误。
答案 1 :(得分:2)
那是因为你的这一行line.Split( ',' );
必须返回一个项目。您返回的数组values
只有一个元素。
在添加之前,您应该检查是否存在任何元素,如下所示: -
if(values.Length > 1)
listB.Add( values[1] );
答案 2 :(得分:1)
在文件/文档中的一行上,您没有任何拆分。我的意思是你没有
value,value
您可以检查string
数组是否包含两个值,然后执行添加到列表或仅修复文件。
此外,您可以尝试查看如何使用OleDbConnection
读取csv文件。
在这个问题中,我写了如何在DataTable
中阅读和存储数据:
C# Read a particular value from CSV file
答案 3 :(得分:1)
通过您的csv数据枚举如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CSV_ReadCsvColumn
{
class Program
{
private static IEnumerable<string[]> LoadCsvData(string path, params char[] separator)
{
return from line in File.ReadLines(path)
let parts = (from p in line.Split(separator, StringSplitOptions.RemoveEmptyEntries) select p)
select parts.ToArray();
}
static void Main()
{
IEnumerable<string[]> lines = LoadCsvData(@"file.csv", ';');
if (lines != null)
{
// Print column one.
foreach (var line in lines)
Console.WriteLine(line[0]);
// Print column two.
foreach (var line in lines)
Console.WriteLine(line[1]);
}
}
}
}