首先在“_”之后修剪文件名中的所有字符

时间:2009-07-11 19:37:07

标签: c# string

我想修剪这些采购订单文件名(下面的几个例子),以便省略第一个“_”之后的所有内容。

INCOLOR_fc06_NEW.pdf 保留:INCOLOR(将此写入db作为VendorID)删除:_fc08_NEW.pdf

NORTHSTAR_sc09.xls 保留:NORTHSTAR(将此作为VendorID写入db)删除:_sc09.xls

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

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

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

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

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

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

让你的火焰喷射器......

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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('_');

答案 4 :(得分:0)

我会采用SubString方法,但为了完善乐趣,可以使用LINQ方法来完善可用的解决方案:

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

如果没有找到下划线,它将返回原始字符串。

答案 5 :(得分:0)

要使用所有“替代”解决方案,这是我想到的第二个(在子字符串之后):

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