2014-12-08 3 views
-1

Вопрос:удалить часть строки C# (FileName)

Я файлы с отметкой времени добавляется к их именам, например:

"презентация окончательного project_20141207182834657.pptx"

И

«окончательная презентация project_201412071864035.pptx "

Как удалить часть« _date »?

Обратите внимание, что я не могу подсчитать символ, потому что иногда дата составляет 15 символов, а иногда и больше, мне нужно как-то удалить часть строки, начинающуюся с «_20», пока не достигнет «.». (точка), или, может быть, кто-то получил лучшую идею.

фона:

У меня есть хранение файлов, прежде чем я загрузить файл я даю ему метку времени, как это:

(JavaScript)

function getDate() { 
var today = new Date(); 
var year = today.getFullYear().toString(); 
var month = (today.getMonth()+1).toString(); 
var day = today.getDate(); 

if (day < 10) 
    day = "0" + day.toString(); 
else 
    day = day.toString(); 

var hours = today.getHours().toString(); 
var minutes = today.getMinutes().toString(); 
var seconds = today.getSeconds().toString(); 
var miliSecond = today.getMilliseconds().toString(); 


return year+month+day+hours+minutes+seconds+miliSecond; 
} 

и что такое return from this function Я добавил к имени файла.

Теперь я хочу, чтобы вернуть файл пользователю, но без штампа даты я добавил в файл ..

Спасибо.

Update

Позвольте мне дать дикий сценарий, есть подчеркивание "_" не только до даты, как это:

"presentation_final_project_201412071864035.pptx"

I не могу доверять индексу «_», потому что его можно повсюду.

+1

http://msdn.microsoft.com/en-us/library/xwewhkd1%28v=vs.110%29.aspx – marsze

+1

Так что ваш ожидаемый результат выглядеть как «презентация окончательного project.pptx»? –

+1

Начните с правого конца строки и найдите первый '_'. Затем удалите текст между ними и '.'. –

ответ

2

Это довольно тривиально. Найти позиции персонажей и построить новую строку, используя Substring():

string input = "presentation final project_20141207182834657.pptx"; 

int underscoreIndex = input.LastIndexOf("_"); 
int dotIndex = input.LastIndexOf("."); 

string newFilename = input.Substring(0, underscoreIndex); 
newFilename += input.Substring(dotIndex); 

в действии на Ideone.com.

+1

Позвольте мне дать дикий сценарий, есть подчеркивание «_» не только до даты, как это: > «presentation_final_project_201412071864035.pptx» Я не могу доверять индекс «_», потому что его может быть везде. – Ron

+3

@Ron Прочтите ответ, пожалуйста. CodeCaster использует 'LastIndexOf'. Кроме того, не было бы лучше дать точные спецификации формы ввода в вопросе? –

+1

@CodeCaster: Ваш ответ в порядке, насколько мне известно. Знаете ли вы разницу в производительности между 'Remove' (в моем ответе) и конкатенацией' Substring' в вашем ответе? Не должно быть так много, я думаю. +1 –

2

Использование string.LastIndexOf и string.Remove получить текст из:

string text = "presentation final project_20141207182834657.pptx"; 

int indexOfUnderscore = text.LastIndexOf('_'); // find the position of _ 
int indexOfPeriod = text.LastIndexOf('.', indexOfUnderscore); // find the position of . 

// find remove the text between _ and . 
string newText = text.Remove(indexOfUnderscore, indexOfPeriod - indexOfUnderscore); 
+1

Рассмотрите этот ввод: '" presentation_final_project_20141207182834657.pptx "' Или, возможно, этот ввод: '" presentation_final_pro.ject_20141207182834657.pptx "' –

+1

@DavidHeffernan: True, 'LastIndexOf' решит это, как в пересмотренном ответе. Также будет проблема, если имя файла было «презентация final project_20141207182834657_abc.pptx'. –

+2

@ ДавидХеффернан: Почему бы и нет. Он работает для текста, предоставленного OP, и вашего дополнительного требования. Любые указатели, что осталось? –

-1

здесь регулярное выражение решение

string file = "presentation final project_201412071864035.pptx"; 
var result = Regex.Replace(file, @"(.*)(_[\d]{15,})(.*)$", "$1$3"); 
3

Для извлечения части файла я бы использовать метод класса Path, чтобы быть более независимыми от ОС

string input = "presentation final project_20141207182834657.pptx"; 
string pureFile = Path.GetFileNameWithoutExtension(input); 
string ext = Path.GetExtension(input); 
int pos = pureFile.LastIndexOf('_'); 
string newFile = pureFile.Substring(0, pos) + ext; 

Уведомление, чтобы найти символ подчеркивания, который необходимо запустить от конца входной строки, а не от начала, чтобы избежать ложных срабатываний (в нижнем подчеркивании присутствует до последнего)

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

-1
string oldpath = "presentation_final_project_201412071864035.pptx"; 
string date = oldpath.Split('_').LastOrDefault().Split('.').FirstOrDefault(); 
string newpath = oldpath.Replace("_" + date, ""); 
+0

OP хочет файл без части даты, а не часть даты – Steve

+0

Хорошая точка, добавленная линия. – cacheCache

0

string r = "presentation final project_2011207182834657.pptx";

 string part1 = r.Substring(0, r.IndexOf(@"_")); 

     string part2 = r.Substring(r.IndexOf(@"."), 5); 

     Console.WriteLine(part1); 

     Console.WriteLine(part2); 

     Console.WriteLine(part1 + part2);