使用正则表达式

时间:2016-05-06 13:04:28

标签: c# regex csv

我有一个从指定文件夹中读取文件的函数。它使用xml文件来获取文件名及其路径。 当文件名为Finance.csv时,它工作正常,但现在需求已更改,文件名有时间戳(Finance_May2016.csv),配置文件包含以下内容

<filename>Finance_{Date:mmmYYYY}.csv <\filename>
<Path> C:\folder <\Path>

到目前为止,我有这个

public string GetFullName(string source, string path)
{
    string formatPrefix = "Date";
    string regex = string.Format("{{{0}(:([^}}]*))?}}", formatPrefix);
    string replacement = @"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{4}";
    Regex rgx = new Regex(regex);
    string result = rgx.Replace(source, replacement);
    FileInfo[] filePath = new DirectoryInfo(path).GetFiles();
    var Filename = filePath.FirstOrDefault().Name;
    var matches = Regex.Matches(Filename, result);
    if (matches.Count == 1)
    {
        return Filename;
    }
    return "";
}

所以我在这里传递文件名&amp;来自配置文件的路径,它会比较文件夹中是否存在与配置文件中设置的名称和DateTime格式匹配的文件。 到目前为止它工作,但因为正则表达式是硬编码它只搜索mmmYYYY日期格式,如果在配置文件中我设置了新的文件名格式,如{Date:ddmmyyyy}_Finance.csv。目前的正则表达不会起作用。

我的问题是否还有其他更优雅的方法来实现这一目标吗?我尝试将Directory.Getfiles()与一些搜索模式过滤器一起使用,但没有运气。

提前感谢任何信息

2 个答案:

答案 0 :(得分:0)

规范化格式以使其匹配。网(例如mm =&gt; MM)后,尝试将文件的最后一部分转换为给定格式的日期:

string mask   = "ddMMyyyy";
string egFile = "Finance_01052016.csv";

if (egFile.Length >= mask.Length) {
    string possibleDate = Path.GetFileNameWithoutExtension(egFile).Substring(mask.Length);

    DateTime dateTime;
    if (DateTime.TryParseExact(possibleDate, mask, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) {
        Console.Write("{0} is {1}", egFile, dateTime);
    }
}

答案 1 :(得分:0)

从上面的代码中,您正在查找具有FinanceMMMyyyy.csv模式的文件。然后检索找到的第一个文件。以下代码更具可读性。如果可能的话,我想避免正则表达式。

using System;
using System.IO;

var MONTH_CHARS = 3;
var YEAR_CHARS = 4;
var FILE_NAME = "Finance";

string filePattern = @"Finance*.csv";
string path = @"c:\temp\";



    foreach (var filePath in Directory.GetFiles(path, filePattern))
{
    var startIndex = FILE_NAME.Length;
    var fileName = Path.GetFileName(filePath);
    var month = fileName.Substring(startIndex, MONTH_CHARS);
    var year = fileName.Substring(startIndex + MONTH_CHARS, YEAR_CHARS);

    Console.WriteLine(fileName + "," + month + year);

    if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year)) continue;

    //Check for proper month and year here

    resultingFileName = fileName;

    break;
}

Console.WriteLine(resultingFileName);

对于日期位于文件名开头的情况,您可以执行以下操作:

 var MONTH_CHARS = 2;
 var YEAR_CHARS = 4;
 var FILE_NAME = "Finance";


 string filePattern = @"*Finance.csv";
 string path = @"c:\temp\";
 var resultingFileName = "";
 var startIndex = 0;

 foreach (var filePath in Directory.GetFiles(path, filePattern))
 {

     var fileName = Path.GetFileName(filePath);

     var year = fileName.Substring(startIndex , YEAR_CHARS);
     var month = fileName.Substring(YEAR_CHARS, MONTH_CHARS);
     var endingFileName = fileName.Substring(YEAR_CHARS + MONTH_CHARS);


     if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year) || 
            string.IsNullOrEmpty(endingFileName)) continue;

     //Check for proper month and year here

     resultingFileName = fileName;

     break;
 }

 Console.WriteLine(resultingFileName);