1 问题描述
如图,两个文件夹下 相同文件名的.csv文件进行配对,将配对成功的文件名按顺存分别储在数组StandardDataPath
、CurrentDataPath
中,匹配成功一对就存储一对,注意匹配的一对文件名在两个数组中各存储一个表示对应关系,并返回匹配的总对数。
例如
“E:\MTF\P1\StandardData”路径下有“00000000000001Tele.csv,00000000000001Wide.csv”两个文件;
“E:\MTF\P1\CurrentData”路径下有“00000000000001Tele.csv,00000000000001Wide.csv,result_Wide.csv”三个文件。
经过配对后发现StandardData文件夹下的两个文件“00000000000001Tele.csv,00000000000001Wide.csv”分别和CurrentData文件夹下的两个文件“00000000000001Tele.csv,00000000000001Wide.csv”名字匹配。
然后我们存储结果示例:
StandardDataPath= {Path+00000000000001Tele.csv,Path+00000000000001Wide.csv},
CurrentDataPath= {Path+00000000000001Tele.csv,Path+00000000000001Wide.csv},
可以看到两个数组中存储的文件名是按顺序一一对应关系,并且文件包含完整的打开路径。
2 分析
因为 两个文件夹下的文件数量和文件类型不一定相同,所以要过滤掉我们不要的文件;
过滤条件“ string[] MatchFilter = { "Wide.csv", "Tele.csv", "Mid.csv" }
;”
只要文件名末尾部分满足““Wide.csv”, “Tele.csv”, “Mid.csv””任意一个,则认为是我们的想要的文件。注意同一个文件名末尾只有MatchFilter数组中一个字符串是匹配的,不存在同一个文件有两多个不同的末尾部分。然后在按照配对规则对文件匹配,匹配成功一对就存储一对,分别储在数组StandardDataPath、CurrentDataPath中。下面是函数名定义。
3 代码实现
private int MatchCsvFiles(string standardDataPath, string currentDataPath, string[] MatchFilter, out string[] standardDataFiles, out string[] currentDataFiles)
{
// 构建匹配后缀的正则表达式模式,用来匹配文件名是否以指定的后缀字符串中的任意一个结尾。
string suffixPattern = "(" + string.Join("|", MatchFilter.Select(filter => Regex.Escape(filter))) + ")$";
var regex = new Regex(suffixPattern);
// 获取标准数据文件夹下的所有文件
var standardFiles = Directory.GetFiles(standardDataPath);
// 存储配对成功的文件路径
var matchedStandardFiles = new List<string>();
var matchedCurrentFiles = new List<string>();
// 遍历标准数据文件
foreach (var standardFile in standardFiles)
{
// 获取文件名
string fileName = Path.GetFileName(standardFile);
// 如果文件名匹配后缀规则
if (regex.IsMatch(fileName))
{
// 构造当前数据文件夹中对应的文件路径
string currentFilePath = Path.Combine(currentDataPath, fileName);
// 如果当前数据文件夹中存在对应文件,则存储匹配成功的文件对
if (File.Exists(currentFilePath))
{
matchedStandardFiles.Add(standardFile);
matchedCurrentFiles.Add(currentFilePath);
}
}
}
// 将配对成功的文件路径数组赋值给输出参数
standardDataFiles = matchedStandardFiles.ToArray();
currentDataFiles = matchedCurrentFiles.ToArray();
// 返回配对成功的文件对数
return standardDataFiles.Length;
}
匹配存储结果