【问题标题】:How to compare filenames with partial match from a table or list如何将文件名与表或列表中的部分匹配进行比较
【发布时间】:2016-12-22 11:57:28
【问题描述】:

我目前正在尝试编写一个简单的工具来轮询一些在指定时间到达服务器的文件,以确认它们已经到达并记录任何丢失的文件。他们将在此文件夹中放置大约。 40分钟,然后通过脚本自动移出(我无法控制)。

我的问题是:

如何将部分匹配的文件名与表格进行比较(我想将文件名中的唯一标识符(下面的NUMBERNUMBER2)与用户可以通过 Windows 表单更新的预定义表格上的标识符进行匹配) .大概我想拆分字符串,所以我拆分了NUMBERNUMBER2,所以我可以比较它们,看看它们是否包含在文件名中(两个数字必须包含在文件名中它是匹配的,并且顺序很重要)。

文件名格式:

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

    }

【问题讨论】:

  • 我看不到这里的问题。只需循环 array1 中的所有文件,由 _ 拆分并获取第 3 个和第 4 个数组元素以获取两个数字...
  • string[] fileNameItems = name.Split('_'); 然后您可以使用fileNameItems[fileNameItems.Length -1] 获取最后两项,即数字并查找它们

标签: c# .net compare string-comparison


【解决方案1】:

如何创建一个类来存储文件路径和文件名的数字部分。在这里,我将这些数字连接在一起,这样比较容易。

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

【讨论】:

  • 这太棒了。过滤器是一个非常优雅的解决方案,我必须从里到外学习它,我相信它会对我再次有用。
【解决方案2】:

您只需在每个文件名上使用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);
    } 

}

【讨论】:

  • 感谢您的帮助!虽然我不会使用这个特定的解决方案,但它对我学习很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2020-05-26
相关资源
最近更新 更多