【问题标题】:Reading a CSV file from a specific row从特定行读取 CSV 文件
【发布时间】:2021-03-24 14:07:43
【问题描述】:

我有一张来自 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);
                    }

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

【问题讨论】:

  • CSV helper 是一个很好的读取 csv 的库。相关:How to read a header from a specific line with CsvHelper?.
  • 我也建议不要在 SO 上使用图片。如果有人想制定解决方案,他必须自己输入所有内容。
  • 顺便说一句 ReadAllLines 返回一个 string[]。不需要ToList。如果您打算跳过其中的 7 个,您可以使用 ReadLines 方法,该方法将返回 IEnumerable
  • 那么,您目前的方法有什么不工作的地方?除了明显的时间在columns[1] 和电子邮件在columns[4] 之外,您可能需要对时间进行某种解析......
  • 您可能还想更好地定义。因为你可以一行var result = File.ReadLines(path, Encoding.Default).Skip(7).Select(x=&gt; x.Split(';')).Select(x=&gt; new Foo{JoinTime= columns[0],Email = columns[1]}).ToList(); 但它几乎不会更好或最坏。

标签: c# linq csv


【解决方案1】:

使用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);
            }

【讨论】:

  • 很高兴知道 ;)
  • @cinchoo 出于某种原因,我在尝试您的解决方案后得到了 null。
  • 发布您的示例原始 CSV 文件。
  • 会议摘要 参加者总数 4 会议名称 测试 会议开始时间 3/11/2021, 12:57:48 PM 会议结束时间 3/11/2021, 1:28:13 PM 全名加入时间 离开时间 电子邮件角色 Smith, John。 3/11/2021, 12:57:48 PM 3/11/2021, 1:28:08 PM 30m 20s TEST39@test.com 主持人 Marshall, Micah D. 3/11/2021, 12:59:11 PM 3 /11/2021, 1:28:07 PM 28m 56s TEST18@test.com 主持人 Hugh, Grant V. 3/11/2021, 1:00:08 PM 3/11/2021, 1:28:13 PM 28m 5s TEST5@test.com 组织者 Cole, Brad R. 3/11/2021, 1:27:03 PM 3/11/2021, 1:28:07 PM 1m 4s TEST4@test.COM 主持人
  • @Cincho 你可以使用以上数据
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多