读取每行中包含字段名称的CSV文件?

时间:2013-11-20 11:30:15

标签: c# csv csvhelper

我正在使用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$。因此,按索引读取失败。如何只读取可用数据以及如何根据每行中可用的字段名称进行映射。

2 个答案:

答案 0 :(得分:2)

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

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

  1. 请勿使用CSV框架。
  2. 一次从文件中读取每一行。
  3. 拆分,上的行,为您提供键值对。
  4. 拆分=上的键值对以分为两部分。
  5. (可选)从密钥名称中删除$
  6. 然后,您应该拥有适当级别的数据,以将这些值传输到您拥有的任何目标对象中。

答案 1 :(得分:0)

这将写入带有标题的单独文件,后跟值。

        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();
        }