2013-11-20 93 views
2

我正在使用ERP集成软件。我需要从HRM应用程序解析CSV文件以进行输入。
我正在输入CSV文件是这样的:在每行中读取具有字段名称的CSV文件?

$ Emp.No $ = 123456,$ CardNo $ = 254658,$银泰$ = “二○一三年十二月一十一日9时03分05秒”,$ OutTime $ =“2013/12/11 17:25:20”
$ Emp.No $ = 565556,$ CardNo $ = 254689,$ InTime $ =“2013年12月11日09:03:50”,$ OutTime $ =“2013年12月11日18时01分11秒”

的CSV文件没有列名头,而不是每个字段有它里面$FieldName$相关的字段名。

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

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

回答

2

你还没有一个CSV文件。你有一个数据文件,其中的每一行包含一个或多个键/值对,用逗号分隔。密钥和值由=分隔,密钥由$'s括起来。

已经表示你有什么,应该帮助你找出一个解决方案:

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

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

0

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

 string file [email protected]"D:\STACKOVERFLOW\csvproblem.txt";    
     string newfile [email protected]"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(); 
     } 
相关问题