【问题标题】:Reading CSV file having Field name in each line?读取每行中具有字段名称的 CSV 文件?
【发布时间】:2013-11-20 11:30:14
【问题描述】:

我正在使用 ERP 集成软件。我需要从 HRM 应用程序中解析 CSV 文件以创建条目。
我得到这样的输入 CSV 文件:

$Emp.No$=123456,$CardNo$=254658,$InTime$="12/11/2013 09:03:05",$OutTime$="12/11/2013 17:25:20"
$Emp.No$=565556,$CardNo$=254689,$InTime$="12/11/2013 09:03:50",$OutTime$="12/11/2013 18:01:11"

CSV 文件没有列名标题,而是每个字段在$FieldName$ 内都有一个与之关联的字段名。

我尝试用CSVHelper 解析它。使用ReadFieldsByIndex() 方法时,它工作正常。

问题:
某些列没有$InTime$$OutTime$。因此,按索引读取失败。如何仅读取可用数据以及如何根据每行中可用的字段名称进行映射。

【问题讨论】:

    标签: c# csv csvhelper


    【解决方案1】:

    那里没有 CSV 文件。您有一个数据文件,其中每一行包含一个或多个键/值对,以逗号分隔。键和值由= 分隔,键由$ 括起来。

    表达了你所拥有的,这应该可以帮助你找到解决方案:

    1. 不要使用 CSV 框架。
    2. 从文件中一次读取每一行。
    3. 拆分, 上的行以提供键值对。
    4. = 上的键值对拆分为两部分。
    5. (可选)从密钥名称中删除 $

    然后,您应该有合适的数据级别来将这些值传输到您拥有的任何目标对象中。

    【讨论】:

      【解决方案2】:

      这将写入带有标题和值的单独文件。

              string file =@"D:\STACKOVERFLOW\csvproblem.txt";            
              string newfile =@"D:\STACKOVERFLOW\output.txt";
      
              StreamReader sr = new StreamReader(file);
              StreamWriter sw = new StreamWriter(newfile);
      
      
              try{
                  string header = "";
                  StringBuilder sb = new StringBuilder();
                  StringBuilder sb_header = new StringBuilder();
                  bool recordHeader = true;
      
                  while(sr.EndOfStream==false){
                      string readLine = sr.ReadLine();
                      string[] split = readLine.Split(',');
                      sb = new StringBuilder();
      
                      foreach (string str in split)
                      {
                          if (recordHeader)
                          {
                              if (str.IndexOf('$') < str.LastIndexOf('$'))
                              {
                                 sb_header.AppendFormat("{0},",
                                     str.Substring(str.IndexOf('$'),str.IndexOf('$')+str.LastIndexOf('$')+1));
                              }
                          }
      
                          sb.AppendFormat("{0},", str.Substring(str.IndexOf('=')+1));
                      }
      
                      if (recordHeader)
                      {
                          sw.WriteLine(sb_header.ToString().Trim(','));
                      }
                      sw.WriteLine(sb.ToString().Trim(','));
      
                      recordHeader = false;
                  }
              }
              finally{
                  sr.Close();
                  sw.Close();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-11
        • 2023-03-15
        • 1970-01-01
        • 2017-08-07
        • 2020-05-26
        • 2021-02-19
        • 1970-01-01
        相关资源
        最近更新 更多