2016-12-20 3 views
0

У меня есть запрос, который получает число сотрудников из поля, содержащее имя пользователя и номер сотрудника в поле, как это:Как проверить наличие символа в запросе Linq в CSV-файле?

имя [номер сотрудника]

например

Фред Bloggs [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, 

Таким образом, у вас есть все ваши неправильные форматы в коллекции. После этой строки кода вы можете проверить, есть ли какие-либо элементы в коллекции с данными «--Invalid data--» как empNo. Вы можете указать UserName как ссылку на пользователей, чтобы они могли исправить свои данные.

Необязательно вы также можете вернуть все ваше row.Field<string>("User name") добавляется какой-то жёстко текста, как --ERROR. Это поможет вам захватить даже неверные данные.

0

вы можете использовать пункт Позволять и проверить длину строкового массива, прежде чем пытаться получить доступ к индексу 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, 
      }); 
Смежные вопросы