查找部分名称为c#

时间:2018-02-05 19:32:50

标签: c#

我想编写一小段代码,用于检查excel中的某个列以查找文件名,找到它然后重命名它。

我就是这样做的:

int colNo = oWorksheet.UsedRange.Columns.Count;
int rowNo = oWorksheet.UsedRange.Rows.Count;

// read the value into an array.
object[,] array = oWorksheet.UsedRange.Value;
for (int j = 1; j <= colNo; j++)
{
    for (int i = 1; i <= rowNo; i++)
    {
        if (array[i, j] != null)
        {
            if (array[i, j].ToString() == "vin")
            {
                for (int m = i + 1; m <= rowNo; m++)
                {
                    try
                    {
                        string name = array[m, j].ToString(); //accessing the name to be renamed
                        string invoice_name = array[m, j + 7].ToString(); // invoice_name
                        invoice_name.Trim();

                         string directoryPath = @"C:\Users\User\Documents\Invoices\";
                         invoice_name = invoice_name.Replace(" ", "");
                         string[] files = new string[0];
                         files = System.IO.Directory.GetFiles(directoryPath, "*" + invoice_name + ".pdf");
                         // then do something with the found files
                        }

我的代码正在做的是搜索位于directoryPath中的文件,然后使用存储在&#39; invoice_name&#39;中的相同值查找它们。由于我使用的是*通配符,因此它会搜索与&#39; invoice_name&#39;中的值同名的所有文件。

但是,如果找到的文件的值与发票名称&#39;中存储的值的80%相匹配然后Directory.GetFiles方法返回null。例如,如果值存储在&#39; invoice_name&#39;是迈克尔&#39;然后Directory.GetFiles返回所有名称为&#39; Michael&#39;或迈克尔+某事 但是,它不会返回名称为“Michae&#39;,&#39; Micha&#39;,&#39; Mich&#39;或者不到迈克尔的任何东西。

有人可以建议吗?我一直在研究现有的解决方案/问题,我发现了这个: How to find folders and files by its partial name c#但它并没有帮助我,我试了一下。

2 个答案:

答案 0 :(得分:0)

这会给你80%的字符串,并找到名称匹配的值,但是,80%的“Michael”不会给你“Micha”。这只是一个如何根据您的问题获得所需结果的示例。

只需在80%的名称上搜索通配符:

    var str = "Michael";

    // get 80% of the string length
    var i = ((double) str.Length / 100) * 80;
    var x = Convert.ToInt32(i);

    var partialName = str.Substring(0, x);
    var files = Directory.GetFiles(directory, partialName + "*");

答案 1 :(得分:0)

不确定这是否正是您正在寻找的内容,但您可以考虑构建一个循环,在该循环中删除您要搜索的前缀中的最后一个字符(在您的示例中为"Michael")搜索直到找到匹配项:

public static List<string> FindClosestPrefixMatches(string directory, string filePrefix, 
    string fileSuffix)
{
    var result = new List<string>();

    if (!Directory.Exists(directory)) return null;

    // Loop removes one character from filePrefix on each search iteration
    for (int i = filePrefix.Length; i > 0; i--)
    {
        var wildcardName = filePrefix.Substring(0, i) + "*" + fileSuffix;
        var files = Directory.GetFiles(directory, wildcardName);

        if (files.Any())
        {
            result.AddRange(files);
            break;
        }
    }

    return result;
}