2016-12-20 53 views
0

我有一個查詢從一個字段包含在這樣的領域中的用戶名和僱員號得到一個員工編號:如何檢查CSV文件的Linq查詢中是否存在字符?

名稱[僱員號碼]

例如

弗雷德·布洛斯[1234]

我的查詢工作正常的大部分時間,但偶爾的字段不包含員工數量,因此它拋出一個「索引超出範圍」異常。 (即如果字段只包含「弗雷德布羅格斯」就會失敗。)

查詢如下:

var allEmpNos = (from row in csvTable.AsEnumerable() 
       join d in DeltekList 
       on row.Field<string>("Phone number") equals d.Mobile into t 
       from rt in t.DefaultIfEmpty() 
       select new 
       { 
        name = row.Field<string>("User name"), 
        empNo = rt == null ? row.Field<string>("User name").Split('[')[1].Replace("]", "") : rt.EmpNo, 
        }); 

我如何處理「壞數據」在運行時?我的理想將是它拋出一個異常,告訴用戶更正CSV文件。我可以通過解析CSV兩次,第一次檢查的「[」和「]」的存在,然後再次做實際進口做到這一點,但作爲CSV是相當大的,這似乎效率不高。

回答

1

你可以改變你的條件是這樣的..

empNo = rt == null ? (row.Field<string>("User name").Contains("[")? 
         row.Field<string>("User name").Split('[')[1].Replace("]", "") 
         :"--Invalid data--") 
        : rt.EmpNo, 

這樣一來,你有收集所有的格式不正確。在這行代碼之後,您可以檢查集合中是否有任何與「」 - 無效數據 - 「一樣的項目,如同empNo。您可以將用戶名稱作爲用戶的參考,以便他們可以更正其數據。 ,你也可以回到你的整個row.Field<string>("User name")附有像--ERROR一些硬編碼的文本。這將幫助您捕捉甚至是不正確的數據。

0

你可以使用let子句和檢查字符串數組的長度您嘗試訪問索引前1.這確實是未經測試,但它應該給你的想法:

var allEmpNos = (from row in csvTable.AsEnumerable() 
      join d in DeltekList 
      on row.Field<string>("Phone number") equals d.Mobile into t 
      from rt in t.DefaultIfEmpty() 
      let arr = row.Field<string>("User name").Split('[') 
      select new 
      { 
       name = row.Field<string>("User name"), 
       empNo = rt == null ? ((arr != null && arr.Length > 1) ? arr[1].Replace("]", "") : string.Empty) : rt.EmpNo, 
      }); 
相關問題