2016-12-20 5 views
0

I持って、このような分野で自分のユーザ名と従業員番号を含むフィールドから従業員番号を取得するクエリ:CSVファイルのLinqクエリで文字の存在を確認するにはどうすればよいですか?

名[社員番号]

例えば

フレッドBloggsは[1234]

私のクエリは、ほとんどの時間を正常に動作しますが、時折、フィールドには、従業員番号が含まれていない、ので、それは例外で、「範囲外のインデックス」がスローされます。以下のように(。すなわち、フィールドはちょうどそれが失敗します「フレッドBloggs」が含まれている場合)

クエリは次のとおりです。

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を2回解析し、「[」と「]」の存在を確認してから再度実際のインポートを行うことでこれを行うことができますが、これはCSVがかなり大きいので非効率的です。

答えて

1

あなたはこのような何かにあなたの状態を変更することができます。..

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

をこの方法で、あなたは、コレクション内のすべてのあなたの間違ったフォーマットを持っています。このコード行の後に、コレクションに " - 無効なデータ - "という項目があるかどうかを、empNoで確認できます。ユーザー名をユーザーに参照して、データを修正できるようにすることができます。

0

インデックスにアクセスする前に、let句を使用して文字列配列の長さを確認することができます。この場合、には--ERRORのようなハードコードテキストが追加されます。これは実際にはテストされていませんが、それはあなたに考えを与える必要があります:

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, 
      }); 
関連する問題