C# 读取CSV文件

C# 读取CSV文件,c#,.net,csv,console-application,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 = ne

我编写了一个从
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
有关的所有内容时,它会起作用并显示第一列

有人能帮我理解我做错了什么吗


谢谢,

发生此错误的原因可能是读取的行后面没有“,”字符或文本。因此,值[1]不存在,并引发错误。例如,您可以使用

if(values.length < 2)
{
    //do what ever is needed in your case
}
if(values.length<2)
{
//做你需要做的事情
}
或者确保正在读取的文件在每行上至少有两个由“,”分隔的值。线条

文本1


例如,将导致该错误。

这是因为您的this line
line.Split(',')必须返回,单个项目。返回的数组
只有一个元素

在添加之前,应检查是否存在任何元素,如下所示:-

if(values.Length > 1)
    listB.Add( values[1] );

文件/文档中的一行上,没有任何拆分。我是说你没有

value,value
您可以检查
字符串
数组是否包含两个值,然后执行添加到列表或修复文件

您还可以尝试查看如何使用
OleDbConnection
读取csv文件

在这个问题中,我写了如何在
DataTable
中读取和存储数据:

通过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]);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
名称空间CSV\u ReadCSV列
{
班级计划
{
私有静态IEnumerable LoadCsvData(字符串路径,参数char[]分隔符)
{
从文件.ReadLines(路径)中的行返回
让parts=(从line.Split(分隔符、StringSplitOptions.RemoveEmptyEntries)中的p选择p)
选择parts.ToArray();
}
静态void Main()
{
IEnumerable lines=LoadCsvData(@“file.csv”,“;”);
如果(行!=null)
{
//打印第一列。
foreach(行中的var行)
Console.WriteLine(第[0]行);
//打印第二栏。
foreach(行中的var行)
Console.WriteLine(第[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]);
            }
        }
    }
}