在第一个“_”之后删除文件名中的所有字符

在第一个“_”之后删除文件名中的所有字符

问题描述:

我想删除这些采购订单文件名(以下几个示例),以便省略第一个“_”后面的所有内容。在第一个“_”之后删除文件名中的所有字符

INCOLOR_fc06_NEW.pdf 保持:INCOLOR(写这DB作为卖方ID)删除:_fc08_NEW.pdf

NORTHSTAR_sc09.xls 保持:NORTHSTAR(写这DB作为卖方ID)删除:_sc09.xls

我们的场景:管理员正在将这些文件上传到我们的Intranet Web服务器,以使它们可用于下载/查看等。我使用Brettles NeatUpload,并为每个上传的文件,将文件属性写入PO表(sql 2000)。文件名的第一部分将作为VendorID写入数据库。

这些文件的命名约定是一致的,因为文件的第一部分始终是供应商名称(或供应商ID)后跟一个“_”,然后其他不可预知的字符用于标识采购订单的类型,然后文件扩展名 - 它始终是.xls,.XLS,.PDF或.pdf。

我试过TrimEnd - 但是你必须提供的字符数组最终会变长,并且可能与我想保留的文件名部分发生冲突。我有一种感觉,我没有正确使用TrimEnd。

什么是最好的方式来使用string.TrimEnd(或在C#中的任何其他字符串操作),将删除第一个“_”后的所有字符?

+0

你说你要第一个下划线后删除一切,但什么下划线本身? – 2009-07-11 21:21:16

+0

是的,我需要删除第一个下划线。那只会让我看到供应商的名字 - 这正是我需要的。 – Doug 2009-07-11 21:42:13

我可能会冒犯反正规游戏大厅,但我在这里(躲避):

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

此代码将除去第一个'_'之后的所有额外字符,除非字符串中没有'_'(然后它将仅返回原始字符串)。

这是一行代码。它比更复杂的IndexOf()算法慢,但是当用于代码的非性能敏感部分时,这是一个很好的解决方案。

让您的火焰喷射器了...

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

return index >= 0 ? s.Substring(0,index) : s; 
+2

在使用Substring()之前检查索引是很好的,但是你要返回他想要修剪的部分,而不是最初的部分。最好让`return index> = 0? s.substring(0,index-1):s;` – Sean 2009-07-11 19:45:00

+2

这将返回OP要删除的部分。你应该使用s.Substring(0,index)来代替。 – 2009-07-11 19:45:57

+0

(或可能(0,索引),我不记得,如果子字符串参数是包容性或独家。) – Sean 2009-07-11 19:46:03

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"); 

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; 

如果你想要做的与其他部件的东西,你可以使用一个拆分

string fileName = "INCOLOR_fc06_NEW.pdf"; 
string[] parts = fileName.Split('_'); 

我会与子串的方法去,但轮出可用的解决方案在这里只是一个有趣的LINQ方法:

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

它会返回如果找不到下划线,则为原始字符串。

为了配合所有的“另类”的解决方案,这里就是我想的(子)之后第二个:

string filename = "INCOLOR_fc06_NEW.pdf"; 
string stripped = filename.Split('_')[0];