C# 比较 2 个文件内容以进行匹配
本文关键字:比较 文件 | 更新日期: 2023-09-27 18:30:37
我正在尝试找到一种方法来比较 2 个文件中的一些文本,如果找到匹配项,则运行一个进程。
以下是文件的示例;
"文件 A" = 具有此格式的自动文本列表;
example1
ex2
289 Example
fht_nkka
"文件 B" = 目录搜索中的文件名;
example1
test2
test4785
使用我的 2 个示例文件,我想搜索它们并找到匹配项。
因此,上面的"文件 A"包含"示例 1",而"示例 1"位于"文件 B"中。我希望能够做的是基于所有匹配项创建"字符串[]匹配。有没有简单的方法可以做到这一点?
注意:这些文件并不总是具有相同的行数据或行数。
- 对两个文件中的每个文件使用
System.IO.File.ReadAllLines()
来创建两个字符串数组。 - 创建包含文件名的数组的排序版本以提高搜索性能。可以使用 LINQ 来实现此目的。
- 假设您的第一个文件具有固定的布局,则每条记录所需的文件名应始终位于第 4 行,因此您可以在第二个数组上使用固定增量的
for
循环来读取所需的文件名。 - 使用
Array.BinarySearch()
快速查找文件列表中是否存在所需的文件名(即另一个数组)。
以下是代码的粗略草图:
string[] AllRecs = System.IO.File.ReadAllLines(FIRST_FILE_PATH);
string[] AllFileNames = System.IO.File.ReadAllLines(SECOND_FILE_PATH);
Array.Sort(AllFileNames);
for (int i = 3; i < AllRecs.Length; i += 8)
{
if (Array.BinarySearch(AllFileNames, AllRecs(i) + ".exe") >= 0)
System.Diagnostics.Process.Start(AllRecs(i) + ".exe");
}
设法解决这个问题,这是我所做的;
var fileAcontents = File.ReadAllLines(fileA);
var fileBcontents = File.ReadAllLines(fileB);
HashSet<string> hashSet = new HashSet<string>(fileAcontents);
foreach (string i in fileBList)
{
if (hashSet.Contains(i))
{
// <- DO SOMETHING :)
}
}
//Keep in a list of strings with FileA contents
List<string> linesOfFileA = new List<string>();
string line ;
using (StreamReader sr = new StreamReader(pathToFileA))
{
//read each line of fileA
line = sr.ReadLine();
while(line != null)
{
linesOfFileA.Add(line) ;
line = sr.ReadLine();
}
}
//Now read the contents of FileB
string fileWithoutExtension ;
int posOfExtension ;
using (StreamReader srB = new StreamReader(pathToFileB))
{
//read each line of fileB
line = sr.ReadLine();
while(line != null)
{
posOfExtension = line.LastIndexOf(".");
if(posOfExtension < 0)
{
fileWithoutExtension = line ;
}
else
{
fileWithoutExtension = line.Substring(0,posOfExtension) ;
}
//Check to see if the FileA contains file but without Extension
if(linesOfFileA.Contains(fileWithoutExtension))
{
//Store into another list / or execute here
}
line = sr.ReadLine();
}
}
在代码的第一部分中,您跳过所需的行数,但由于当前显示的格式,它们不会影响您的比较
使用文件
A 内容填充字典对象,然后遍历查询文件 A 字典对象的文件 B 内容。字典对象的原因是它的速度,如果你有大量的数据数组。
Dictionary<int, string> FileA = new Dictionary<int, string>();
string sFileAList = dataFileA;
循环遍历文件 A 内容并添加到 Dict,其中 i 是一个计数器。
int count = 0;
foreach (string s in sFileAList.split(''n')) {
count++;
if (count > 3) FileA.Add(i, s);
}
然后在循环浏览文件 B 内容时进行比较。
foreach (string s in dataFileB.split(''n')) {
if (FileA.ContainsValue(s)) {
// Run exe
}
}