读取CSV文件

时间:2014-12-15 11:32:56

标签: c# .net csv console-application

我编写了一个小程序来读取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列......

有人可以帮我理解我做错了吗?

谢谢,

4 个答案:

答案 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]);
            }
        }
    }
}