文件预测程序

时间:2011-12-29 15:18:46

标签: c# .net regex

我有一个xml配置文件,其中包含以下文件格式:

 <FILE FILEFORMAT="|PREFIX|DATETIME|-|STRING|NUMBER|_|DATETIME2|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|PREFIX|NUMBER|_|DATETIME|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|DATETIME|_|PREFIX|_|STRING|_|DATETIME2|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|PREFIX|_|STRING|_|STRING2|_|DATETIME|_|DATETIME2|-|TIME|SUFFIX|"/>

其中prefix只是字母,datetime / datetime2只是数字,而不是实际的日期时间类型(我将其转换为日期时间),字符串是另一个字母,数字是0到9个数字,时间也是数字,后缀是.xml或.txt。

等文件的格式

实际文件的示例:

`SUXX20111101-BATCH2240_20111113-091322.txt`
`TOBEME826908_20111113-091413.txt`
`2011-12-01_MYSELF_ANDI_20111208-121517.txt`
`WELL_MAYBENOT_TRUE_092011_20111215-022931.txt`

我要完成的是检查天气文件名是否符合指定格式,有多个客户端格式不同,我不知道怎么去解决这个难题,非常感谢任何帮助。基本上这个想法不是触及编程方面,如果将来有更多的文件,将它们的信息添加到配置文件就足够了。

2 个答案:

答案 0 :(得分:1)

我不确定你究竟需要什么,但如果它是描述文件名模式的一种方式,你应该只使用正则表达式。

然后你只需循环所有格式。

以下是如何进行搜索的示例(假设您已经格式化了xml格式,dir中的搜索目录)

Dictionary<string, Regex> formatDic = new Dictionary<string, Regex>();
foreach(XElement curFormat in formats)
{
     formats.Add(
         curFomat.Attribute("NAME"), 
         new Regex(curFomat.Attribute("FILEFORMAT"), RegexOptions.Compiled));
}

foreach(FileInfo curFile in dir.GetFiles())
{
    try
    {
    Console.WriteLine(
        "File : {0} is of type : {1}",
        curFile.FullName,
        (from c in formatDic
         where c.Value.IsMatch(curFile.FullName)
         select c.Key).Single());
    }
    catch
    {
        Console.WriteLine("Error occuring on file : {0}", curFile.FullName);
    }
}

有关正则表达式的更多信息:Regular expression on MSDN

答案 1 :(得分:0)

如果您想这样做,至少需要以下内容:

  • 定义模式组件的某种方式(即DATETIME等)
  • 定义如何验证这些组件的某种方式(即“20110956”不被视为有效日期。
  • 某种定义要识别的模式的方法(即从字符串中解析各个组件)。

可能能够使用正则表达式执行第一个和第三个。在一般情况下,你不能做第二个。如果添加新类型的组件,则必须编写代码来验证它。

您正在尝试构建的是最简单的正则表达式构建器,它可以将不同组件的正则表达式组合到一个定义特定模式的正则表达式中。你真正构建的是解析器生成器,我怀疑你需要这样做。

你还必须非常小心模棱两可。例如,假设您有以下两种格式:

PREFIX|DATETIME|-|NUMBER|SUFFIX
PREFIX|NUMBER|-|DATETIME|SUFFIX

由于DATETIME看起来可能是20110315的形式,因此可以很容易地将其解释为数字。例如,给定:

xyz20110315-20041231.txt

哪个是日期,哪个是数字?

我没有看到你所展示的模式中存在任何明显的问题,但是当你想要添加新格式时,我可以很容易地设想将来遇到问题。您遇到冲突。

此外,如果正则表达式的数量变得非常大,那么针对所有这些正则表达式检查大量传入文件将非常非常昂贵。

在我看来,拥有这样一个通用的文件名分类方案的好处永远不值得花时间构建和维护它。因为 需要维护。事实上,每当你有新客户时,你可能会发现自己会调整它。

所以只需写出最简单的东西即可。在代码中执行此操作,并在您获得新文件类型时自行修改它。