2010-05-29 3 views
2

ОК, у меня есть txt-файлы, которые я обрабатываю и сохраняю в sql-db. Имена отформатированы какC# parsing txt файлы IF формат имени желаемый формат

R306025COMP_272A4075_20090929_080159.txt 

Однако, есть несколько избранных (из тысяч файлов) с именами, которые отформатированы по-разному (в частности, файлы, которые были созданы в качестве тестов), например

R306025COMP_SU2_TestBottom_20090915_101441.txt 

Причина, по которой это вызывает проблему, заключается в том, что я использую Split('_')[1,2,etc] для извлечения номера R, части 272A4075 и части 20090929 (дата). Когда приложение сталкивается с нечетно названными файлами, он терпит неудачу, потому что он пытается проанализировать «TestBottom» как дату и вставляет «SU2» вместо номера 272.

В основном я хочу, чтобы приложение распознало, что если имя файла не отформатировано, как в моем первом примере, пропустите его. Любой совет?

ответ

1
foreach (var fileName in fileNames) { 
    if (fileName.Count(c => c == '_') != 3) continue; 
    // etc... 
} 
2

Вы можете просто сделать следующее на основе разделения:

string[] parsedLine = yourData.Split('_'); 
string theR = parsedLine[0]; 
string theCode = parsedLine[1]; 
string theDatePart = (parsedLine.Length > 4) ? parsedLine[3] : parsedLine[2]; 

Если вы хотите, чтобы просто пропустить это плохие линии просто сделать:

string[] parsedLine = yourData.Split('_'); 
if (parsedLine.Length > 4) continue; // assuming your looping 

бы нужно увидеть немного кода если вы хотите получить лучшее решение, поскольку я не совсем уверен, как вы получаете данные о линии.

+0

@jakesankey Вы должны сделать разделить только один раз и сохранить его, а затем выполнить проверку, если данные действительны, прежде чем пытаться записать в БД. Кажется, что это все, что нужно сделать, без проверки. – Kelsey

+0

проблема с этим будет, если имя изменилось на что-то вроде R306025COMP_TestBottom_20090915_101441_SU2.txt .. Тогда что будет? ??? –

1

Используйте спичку регулярного выражения на имени файла, который означает, что он будет соответствовать регулярному выражению в любом месте в имени файла (так что вам не придется беспокоиться о том, где в строке это происходит, и точный результат выдается вам). Тогда, если вам не удалось найти необходимые совпадения, пропустите файл (никаких исключений не генерируется, вы просто ничего не получаете в своем объекте «Матчи»).

Я бы сделал вам образец, но на данный момент у меня нет VS. Материал Regex живет в пространстве имен System.Text.RegularExpressions.

+0

Я хотел бы увидеть пример этого! –