我想编写一小段代码,用于检查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#但它并没有帮助我,我试了一下。
答案 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;
}