我正在使用ERP BEXT。 BEXT生成4种文件,这些文件必须导入到服务器上。所有文件名都包含特殊的11 character
代码,如下图所示。
在导入之前,文件。我需要检查4个文件是否存在。
我考虑过使用方法GetFileNameWithoutExtension
并使用方法Substring
来获取4个文件名,但是我有点迷失了。因为您不能在表上使用Substring
。
string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToArray();
string[] top = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToArray();
for (int i = 0; i < txt.Length;i++)
{
i++;
Console.WriteLine("Fichier de Type 1 : " + txt[i - 2]);
for (int j = 0; j < top.Length; j++)
{
j++;
Console.WriteLine("Fichier Type 2 :" + top[j - 1]);
if (txt[i - 1] == top[j - 1])
{
System.Diagnostics.Process.Start("//ALICE/interface.exe");
//The Batch sort the files, without issue.
}
else
{
//No matc exiting the P.
}
}
}
Console.ReadLine();
任何帮助将不胜感激。
感谢阅读。
答案 0 :(得分:2)
以下代码将为您提供一个词典,其中的键是文件ID,值是它在目录中遇到该FileID的次数。
public string ExtractIDFromFileName(string filename)
{
return filename.Split('_').Last();
}
public Dictionary<string,int> GetDictOfIDCounts()
{
List<string> allfiles = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToList();
allfiles.AddRange(Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.top").Select(Path.GetFileNameWithoutExtension).ToList());
Dictionary<string, int> dict = new Dictionary<string, int>();
foreach(var x in allfiles)
{
string fileID = ExtractIDFromFileName(x);
if (dict.ContainsKey(fileID))
{
dict[fileID]++;
}
else
{
dict.Add(fileID, 1);
}
}
return dict;
}
所有您需要做的就是检查是否实际找到了您需要的ID 4次,并且这些ID是您导入的ID。
答案 1 :(得分:1)
您可以使用Contains()
方法来检查文件名是否包含您要查找的字符串:
string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x))
.Where(x => x.Contains("BP011910513")).ToArray();
或者,如果您想获取所有名称不带扩展名以给定字符串结尾的文件:
string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x))
.Where(x => x.EndsWith("_BP011910513")).ToArray();
要获取11个字符的ID:
string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x).Split("_").Last())
.Where(x => x.Length == 11).ToArray();
或者:
string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => {
var name = Path.GetFileNameWithoutExtension(x);
return name.Length >= 11; name.SubString(name.Length-11): "";
}).Where(x => x.Length == 11).ToArray();
答案 2 :(得分:1)
LINQ是解决此类问题的好方法
var groupedFiles = from f in Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.t*")
let match = Regex.Match(f, @"([a-zA-Z0-9]{11})(?:\.top|\.txt)$")
where match.Success
let groupKey = match.Groups[1].Value
group f by groupKey into fileGroupItem
let fileGroup = fileGroupItem.ToArray()
where fileGroup.Length == 4
select new { GroupKey = fileGroupItem.Key, FileGroup = fileGroup };
如果获取Directory.GetFiles
会带来很多不需要的文件并降低性能,则可以适当地调整*.t*
来获取所有相关文件。
让我解释一下该查询,我们获取所有相关文件并与正则表达式进行匹配,以找出所有文件组的11位字母数字``groupKey . Now we group the files using this key and eliminate all groups which do not have exactly 4 items.
This gives us
groupedFiles which is an
IEnumerable`拥有全部4个文件。
Regex,可以在将来为您提供灵活性,并且LINQ查询可以轻松扩展以添加更多处理。
我之所以会寻求这种解决方案的最大原因是其可读性。
答案 3 :(得分:0)
获取ID并计算迭代次数的简单方法。
static void Main(string[] args)
{
int w = 0;
int zig = 0;
string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x).Split('_').Last())
.Where(x => x.Length == 11).ToArray();
for (int i = 0; i < IDs.Length; i++)
{
i++;
Console.WriteLine("" + IDs[i - 1]);
if (IDs[w] != IDs[i-1])
{
w++;
}else
{
zig++;
if (zig == 4)
{
Console.WriteLine("l'idée ci-dessous apparait : 4 fois");
Console.ReadLine();
}
}
}