【问题标题】:CSV reading in C#, I just want to read some fieldsC#中的CSV读取,我只想读取一些字段
【发布时间】:2020-01-02 11:45:09
【问题描述】:

我想读取一个 csv 文件,该文件有 9 列 标题 和下面的许多数据行,但我只对其中的三列感兴趣,而且它们 不连续强>。我已尝试使用此代码,但它不起作用,它在 foreach 循环中停止,并出现来自 CsvHelper 的运行时异常“'名称为'Y'的字段不存在。您可以通过将 MissingFieldFound 设置为 null 来忽略丢失的字段。'” .

csv文件是这样的:

FrameNO , Ttotal, TNo, X, Y , Z , Speed , Intensity, ILog ;
1 , 9 , 1 , 0.08, 1.4 , 0 , 0 , 78 , 19 , ;;
1 , 9 , 2 ,0.1 , 1.56 , 0 , 0 , 228 , 28, ;;

using CsvHelper;

namespace RadarPrototipo.Clases
{
    public class Foo
    {
        public int FrameNO { get; set; }
        public double Y { get; set; }
        public int Intensity { get; set; }
    }
    class CCalc
    {
        public double Calc(int f)
        {
            double d=1.5;
            int inten=0;
            using (var reader = new StreamReader("C:/Users/Usuario/Desktop/Uni/AlumnoInterno/grab.csv"))
            using (var csv = new CsvReader(reader))
            {

                csv.Configuration.Delimiter = ",";
                var records = csv.GetRecords<Foo>();
                csv.Configuration.HeaderValidated = null;

                foreach (var Foo in records)
                {
                    if (Foo.FrameNO == f)
                    {
                        if (Foo.Y < 1.8 && Foo.Y > 1.5)
                        {
                            if (Foo.Intensity > inten)
                            {
                                inten = Foo.Intensity;
                                d = Foo.Y;
                            }
                        }
                    }
                }
            }
            return d;
        }
    }
}

该函数分析这三列的数据并根据条件选择最佳答案,然后返回值Y,即距离。 非常感谢任何帮助。

【问题讨论】:

  • 你使用的是什么 CSV 阅读包?
  • 你的 csv 看起来怎么样?有列标题吗? Foo 类中的拼写/大小写与您的相同吗?
  • 请验证您发布给我们的代码是实际代码,因为您问题中的代码应该可以工作Fooforeach 中的变量将包含 FrameNO 属性就好了。如果您向我们提供了展示问题的完整代码,而不仅仅是一条评论说“如果我编写更多代码,问题可能就在这里”,那就更好了。请发布完整的minimal reproducible example
  • 另外,您能否告诉我们问题是编译器给您一个FrameNO不存在的错误,或者如果您得到一个来自 CsvHelper 的运行时异常,指出 csv 文件中不存在列 FrameNO。 csv 文件是否包含标题?如果是,它是否包含名为 FrameNO 的列/字段?

标签: c# csv csvhelper


【解决方案1】:

以下对我有用。

public class Program
{
    public static void Main(string[] args)
    {

        using (MemoryStream stream = new MemoryStream())
        using (StreamWriter writer = new StreamWriter(stream))
        using (StreamReader reader = new StreamReader(stream))
        using (CsvReader csv = new CsvReader(reader))
        {
            writer.WriteLine("FrameNO,Column2,Y,Column4,Column5,Column6,Intensity,Column8,Column9");
            writer.WriteLine("1,two,1.123,four,five,six,10,eight,nine");
            writer.WriteLine("2,two,2.345,four,five,six,20,eight,nine");
            writer.Flush();
            stream.Position = 0;

            var records = csv.GetRecords<Foo>();
            foreach (var Foo in records)
            {
                Console.WriteLine(Foo.FrameNO);
            }
        }

        Console.ReadLine();
    }
}

public class Foo
{
    public int FrameNO { get; set; }
    public double Y { get; set; }
    public int Intensity { get; set; }
}

您可以尝试的一件事是设置分隔符。您的文化默认值可能不是逗号。此外,如果数据和逗号之间有空格,则需要设置TrimOptions

using (var csv = new CsvReader(reader))
{
    csv.Configuration.Delimiter = ",";
    csv.Configuration.TrimOptions = TrimOptions.Trim;
    var records = csv.GetRecords<Foo>();

【讨论】:

  • 只有在文件中有列名的情况下才会起作用。我刚刚尝试了您显示的代码,但没有列名。它引发了相同的错误Header with name 'FrameNO' was not found
  • 您是对的,但原始发布者建议 csv 文件有标题。如果它没有带有“FrameNO”、“Y”和“Intensity”的标题,那么您必须按列号映射它们。
  • 当映射不是此类异常的原因时,下一个最可能的问题是分隔符。 CsvHelper 默认使用用户的文化分隔符,这会导致文化分隔符不是逗号的用户出现问题。 @oleska 在上面尝试我的代码,但添加 csv.Configuration.Delimiter = ";";
  • 我收到The conversion cannot be performed. Text: '1,1,10,four,five,six,seven,eight,nine' 错误,Delimiter = ";"。它看起来与原来的不一样(不幸的是,不清楚原来的错误是什么)。 CsvReader 使用的是CultureInfo.CurrentCulture.TextInfo.ListSeparator 不知道是不是在TS电脑上改了。
  • 这很奇怪。它应该在标题行中失败。您是否包括标题行?我收到CsvHelper.HeaderValidationException: 'Header with name 'FrameNO' was not found. 你是对的。我们需要有关原始发布者数据和确切异常消息的更多信息。
猜你喜欢
  • 2020-12-28
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2012-10-06
  • 2013-01-02
相关资源
最近更新 更多