【问题标题】:Reading in a CSV file读取 CSV 文件
【发布时间】:2014-12-15 11:32:55
【问题描述】:

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

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

谢谢,

【问题讨论】:

  • values 的值是多少?它是否被任何东西填充?它应该填充的字符串是什么?
  • 在调试器中单步调试代码,您很可能会很快找到问题。
  • 没有双关语,当有非常好的库可用时,为什么每个人都尝试编写自己的 CSV 解析器(例如 joshclose.github.io/CsvHelper)?
  • 优秀的sn-p,非常感谢:)

标签: c# .net csv console-application


【解决方案1】:

此错误可能是因为读取的行后面没有“,”字符或文本。因此 values[1] 不存在并且错误被抛出。您可以检查这种情况,例如

if(values.length < 2)
{
    //do what ever is needed in your case
}

或者您确保您正在读取的文件在每一行上至少有 2 个由“,”分隔的值。像

这样的一行

文本1,

例如会导致该错误。

【讨论】:

    【解决方案2】:

    那是因为你的这条线line.Split( ',' ); 必须返回,单项。您返回的数组 values 只有一个元素。

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

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

    【讨论】:

      【解决方案3】:

      在您的 文件/文档 的某一行中,您没有任何拆分。我的意思是你没有

      value,value
      

      您可以检查string 数组是否包含两个值,然后执行添加到列表或只是修复您的文件。

      你也可以试试看如何用OleDbConnection读取csv文件。

      在这个问题中,我写了如何在DataTable 中读取和存储数据: C# Read a particular value from CSV file

      【讨论】:

        【解决方案4】:

        像这样枚举你的 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]);
                    }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-05-23
          • 2015-12-05
          • 2018-10-24
          • 1970-01-01
          • 2016-05-22
          • 2012-08-18
          • 2018-01-20
          • 1970-01-01
          相关资源
          最近更新 更多