2013-11-20 134 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(); 
     } 
相關問題