![](/img/trans.png)
[英]Compare 2 list data with partial match and return aggregated data from both list
[英]How to compare filenames with partial match from a table or list
我目前正在尝试编写一个简单的工具来轮询某些在晚上指定时间到达服务器的文件,以确认它们已经到达并记录所有丢失的文件。 他们将坐在此文件夹中大约。 40分钟,然后通过脚本自动移出(我对此无能为力)。
我的问题是:
如何比较与表进行部分匹配的文件名(我想将文件名中的唯一标识符(下面的NUMBER
和NUMBER2
)与用户可以通过Windows窗体更新的预定义表上的标识符进行匹配)。 大概我想拆分字符串,所以我拆分了NUMBER
和NUMBER2
以便可以比较它们并查看它们是否包含在文件名中( 两个数字都必须包含在文件名中才能匹配,并且顺序很重要) )。
文件名格式:
NCR_XR_D_NUMBER_NUMBER2
由于顺序很重要,因此NCR_XR_D_8003_9611
不等于NCR_XR_D_9611_8003
。
这就是我现在所拥有的:
public static void CheckIfFilesExist()
{
// Put all file names in XR File directory into array.
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
//this location is stored as a app setting, type: string, scope: User. This is tested working OK.
// Print filenames into Console. (making sure the array is populating).
Console.WriteLine("--- Files:---");
foreach(string name in array1)
{
Console.WriteLine(name);
}
}
如何创建一个类来存储文件路径和文件名的数字部分。 在这里,我将数字合并在一起,因为它使比较容易。
public class FileInfo
{
public string FilePath { get; private set; }
public string Numbers { get; private set; }
public FileInfo(string filepath)
{
var fileName = Path.GetFileName(filepath);
if (!fileName.StartsWith("NCR"))
{
throw new ArgumentException("Wrong type of file.");
}
FilePath = filepath;
var nameParts = fileName.Split('_');
Numbers = nameParts[3] + nameParts[4];
}
}
然后您的函数变为:
public static void CheckIfFilesExist()
{
var filesToFilter = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation).Select(f => new FileInfo(f));
var filterValues = GetFilterValues();
var filteredFiles = filesToFilter.Where(f => filterValues.Contains(f.Numbers));
}
其中, GetFilterValues()
返回要查找的值的字符串数组(例如"80039611"
)。
您只需在每个文件名上使用“ Split
即可轻松解决此问题。 就像是:
public static void CheckIfFilesExist()
{
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
foreach(string name in array1)
{
Console.WriteLine(name);
if (Path.GetFileName(name).StartsWith("NCR"))
{
string[] splitted = name.Split('_');
int number1 = int.Parse(splitted[3]);
int number2 = int.Parse(splitted[4].Split('.')[0]);
}
Console.WriteLine(number1);
Console.WriteLine(number2);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.