【问题标题】:Reading repetitive sub-sections of a CSV line / record?读取 CSV 行/记录的重复子部分?
【发布时间】:2020-03-05 00:28:06
【问题描述】:

在 CSVHelper 中,是否可以从源 CSV 文件的单行读取重复的子记录?

我正在使用的 CSV 格式包含以下部分:

所有这些文本都是单行CSV文件

TYPICAL/EXTREME PERIODS,6,
Summer - Week Nearest Max Temperature For Period,Extreme,7/13,7/19,
Summer - Week Nearest Average Temperature For Period,Typical,6/22,6/28,
Winter - Week Nearest Min Temperature For Period,
Extreme,1/20,1/26,Winter - Week Nearest Average Temperature For Period,Typical,12/ 8,12/14,
Autumn - Week Nearest Average Temperature For Period,Typical,10/ 6,10/12,
Spring - Week Nearest Average Temperature For Period,Typical,4/26,5/ 2

第一个字段TYPICAL... 只是一个常量标记。

第二个字段6表示会有多少重复子记录。

因此,以下 6 个字段块每个都具有相同的格式,每个字段 4 个。我想将这 6 个部分中的每一个部分读取/映射到一个单独的类对象,每个类对象都是相同的类型。


我可以在documentation 中看到解析数据的方法有很多种,但似乎没有一种方法能完全映射到这一点。可以将给定行/记录上的所有字段作为可枚举的值列表(或动态大小的dynamic 对象)读取,但这些方法失去了 CSVHelper 的大部分好处,即它可以将数据映射到对象为你。

【问题讨论】:

    标签: csv csvhelper


    【解决方案1】:

    不幸的是,我认为在您的示例中没有使用 CsvHelper 的所有映射功能的好方法,但是手动构建对象相当容易。

    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, CultureInfo.InvariantCulture))
            {
                writer.WriteLine("TYPICAL/EXTREME PERIODS,6,Summer - Week Nearest Max Temperature For Period,Extreme,7/13,7/19,Summer - Week Nearest Average Temperature For Period,Typical,6/22,6/28,Winter - Week Nearest Min Temperature For Period,Extreme,1/20,1/26,Winter - Week Nearest Average Temperature For Period,Typical,12/ 8,12/14,Autumn - Week Nearest Average Temperature For Period,Typical,10/ 6,10/12,Spring - Week Nearest Average Temperature For Period,Typical,4/26,5/ 2");
                writer.Flush();
                stream.Position = 0;
    
                csv.Configuration.HasHeaderRecord = false;
    
                csv.Read();
    
                List<Foo> result = new List<Foo>();
                var rows = csv.GetField<int>(1);
                var index = 2;
    
                for (int i = 0; i < rows; i++)
                {
                    var foo = new Foo
                    {
                        Description = csv.GetField<string>(index),
                        Type = csv.GetField<string>(index + 1),
                        Start = csv.GetField<string>(index + 2),
                        End = csv.GetField<string>(index + 3)
                    };
    
                    result.Add(foo);
                    index += 4;
                }
            }
        }
    }
    
    public class Foo
    {
        public string Description { get; set; }
        public string Type { get; set; }
        public string Start { get; set; }
        public string End { get; set; }
    }
    

    【讨论】:

    • 非常感谢 - 这与我最终所做的非常接近。我也找不到任何方法来真正使用它的类映射,但最终这种方法效果很好。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2016-12-21
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多