首页 > 解决方案 > 从特定行读取 CSV 文件

问题描述

我有一张来自 Microsoft 团队的奇怪 CSV 格式的考勤表,我需要将其存储在数据库中。我上传了 csv 文件(从上面)并想要解析数据。 考勤表

我只是对收到电子邮件和加入时间感兴趣。

这是我迄今为止尝试过的 -

                    var path = Path.Combine(filePath, e.File.GetName());
                    var csvRows = System.IO.File.ReadAllLines(path, Encoding.Default).ToList();
                    List<Foo> lst = new List<Foo>();
                    foreach (var row in csvRows.Skip(7))
                    {
                      Foo foo = new Foo();
                      var columns = row.Split(';');
                       foo.JoinTime= columns[0];
                       foo.Email = columns[1];
                       lst.Add(foo);
                    }

我知道我很接近但想探索一种更好的方法并以正确的格式获取数据。

标签: c#linqcsv

解决方案


使用Cinchoo ETL,您可以解析 csv,如下所示。

PS。仅当 CSV 文件中有固定数量的要忽略的行时,此方法才有效

foreach (var rec in new ChoCSVReader("**** YOUR CSV FILE PATH ***")
    .HeaderLineAt(7)
    .WithDelimiter(";")
    .ConfigureHeader(h => h.HasHeaderRecord = true)
    )
{
    Console.WriteLine(rec["Full Name"]);
    Console.WriteLine(rec["Join Time"]);
}

更新: 基于下面提供的示例 CSV,这里是工作示例。

您提供的示例 CSV 假定为制表符分隔符。

            string csv = @"Meeting Summary
Total Number of Participants    4 
Meeting Title   Test 
Meeting Start Time  3/11/2021, 12:57:48 PM 
Meeting End Time    3/11/2021, 1:28:13 PM 

Full Name   Join Time   Leave Time  Duration    Email   Role 
Smith, John.    3/11/2021, 12:57:48 PM  3/11/2021, 1:28:08 PM   30m 20s TEST39@test.com Presenter 
Marshall, Micah D.  3/11/2021, 12:59:11 PM  3/11/2021, 1:28:07 PM   28m 56s TEST18@test.com Presenter 
Hugh, Grant V.  3/11/2021, 1:00:08 PM   3/11/2021, 1:28:13 PM   28m 5s  TEST5@test.com  Organizer 
Cole, Brad R.   3/11/2021, 1:27:03 PM 3/11/2021, 1:28:07 PM 1m 4s   TEST4@test.COM  Presenter";

            try
            {
                foreach (var rec in ChoCSVReader.LoadText(csv)
                    .HeaderLineAt(7)
                    .WithDelimiter("\t")
                    .ConfigureHeader(h => h.HasHeaderRecord = true)
                    )
                {
                    Console.WriteLine(rec["Full Name"]);
                    Console.WriteLine(rec["Join Time"]);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

推荐阅读