Обрезать все символы по имени файла после первого "_" - PullRequest
0 голосов
/ 11 июля 2009

Я хотел бы урезать эти имена файлов заказов на покупку (несколько примеров ниже), чтобы все после первого "_" было опущено.

INCOLOR_fc06_NEW.pdf Keep: INCOLOR (запишите это в db как VendorID) Remove: _fc08_NEW.pdf

NORTHSTAR_sc09.xls Сохранить: NORTHSTAR (запишите это в db как VendorID) Удалить: _sc09.xls

Наш сценарий: менеджеры загружают эти файлы на наш веб-сервер в интрасети, чтобы сделать их доступными для загрузки / просмотра и т. Д. Я использую Brettles NeatUpload, и для каждого загруженного файла я записываю атрибуты файлов в таблицу PO (sql 2000). Первая часть имени файла будет записана в БД как VendorID.

Соглашение об именовании для этих файлов является последовательным в том, что в первой части файла всегда указывается имя поставщика (или идентификатор поставщика), за которым следует "_", а затем другие непредсказуемые символы, используемые для определения типа заказа на поставку, а затем расширение файла - которое последовательно либо .xls, .XLS, .PDF, либо .pdf.

Я попробовал TrimEnd - но массив символов, который вы должны предоставить, в конечном итоге будет длинным и может конфликтовать с той частью имени файла, которую я хочу сохранить. У меня такое чувство, что я не использую TrimEnd должным образом.

Каков наилучший способ использовать string.TrimEnd (или любое другое манипулирование строками в C #), которое будет отбрасывать все символы после первого "_"?

Ответы [ 6 ]

5 голосов
/ 11 июля 2009
String s = "INCOLOR_fc06_NEW.pdf";
int index = s.IndexOf("_");

return index >= 0 ? s.Substring(0,index) : s;
2 голосов
/ 12 июля 2009

Я, вероятно, оскорблю лобби против регулярных выражений, но я пойду (приглушаясь):

string stripped = Regex.Replace(filename, @"(?<=[^_]*)_.*",String.Empty);

Этот код удалит все дополнительные символы после первого '_', если в строке нет '_' (тогда он просто вернет исходную строку).

Это одна строка кода. Он медленнее, чем более сложный алгоритм IndexOf (), но при использовании в не чувствительной к производительности части кода это хорошее решение.

Выведи свои огнеметы ...

0 голосов
/ 12 июля 2009

Чтобы перейти ко всем «альтернативным» решениям, вот второе, о котором я подумал (после подстроки):

string filename = "INCOLOR_fc06_NEW.pdf";
string stripped = filename.Split('_')[0];
0 голосов
/ 12 июля 2009

Я бы пошел с подходом SubString, но чтобы завершить доступные решения, вот подход LINQ просто для удовольствия:

string filename = "INCOLOR_fc06_NEW.pdf";
string result = new string(filename.TakeWhile(c => c != '_').ToArray());

Будет возвращена исходная строка, если подчеркивание не найдено.

0 голосов
/ 11 июля 2009

TrimEnd удаляет пробелы и знаки препинания в конце строки, здесь вам это не поможет. Узнайте больше о TrimEnd здесь: http://msdn.microsoft.com/en-us/library/system.string.trimend.aspx

Код Bnaffas (с небольшим изменением):

String fileName = "INCOLOR_fc06_NEW.pdf";
int index = fileName.IndexOf("_");

return index >= 0 ? fileName.Substring(0, index) : fileName;

Если вы хотите что-то сделать с другими частями, вы можете использовать Split

string fileName = "INCOLOR_fc06_NEW.pdf";
string[] parts = fileName.Split('_');
0 голосов
/ 11 июля 2009
public string StripOffStuff(string sInput)
{
  int iIndex = sInput.IndexOf("_");

  return (iIndex > 0) ? sInput.Substring(0, iIndex) : sInput;
}

// Call it like:
string sNewString = StripOffStuff("INCOLOR_fc06_NEW.pdf");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...