2

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

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

CSV 文件没有列名标题,而是每个字段在$FieldName$.

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

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

4

2 回答 2

2

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

表达了你所拥有的,这应该可以帮助你确定一个解决方案:

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

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

于 2013-11-20T11:36:04.987 回答
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();
        }
于 2013-11-20T13:20:08.247 回答