C#比较2个文件内容以进行匹配

时间:2013-09-09 12:28:30

标签: c# c#-4.0

我正在尝试找到一种方法来比较2个文件中的某些文本,如果找到匹配项,则运行一个进程。

以下是文件示例;

'文件A' =具有此格式的自动文本列表;

example1
ex2
289 Example
fht_nkka

'文件B' =目录搜索中的文件名;

example1
test2
test4785

使用我的2个示例文件,我想搜索它们并查找匹配项。

所以上面的'文件A'包含'example1','example1'在'文件B'中。我想要做的是根据所有匹配创建'string []匹配。这样做有简单的方法吗?

注意:这些文件并不总是具有相同的行数据或行数。

4 个答案:

答案 0 :(得分:1)

  1. 在两个文件中使用System.IO.File.ReadAllLines()创建两个字符串数组。
  2. 创建包含文件名的数组的排序版本,以提高搜索性能。您可以使用LINQ来实现此目的。
  3. 鉴于您的第一个文件具有固定布局,您的所需文件名应始终位于每行记录的第4行,因此您可以使用固定增量的第二个数组上的for循环来读取所需的文件文件名。
  4. 使用Array.BinarySearch()快速查找文件列表中是否存在所需的文件名(另一个数组)。
  5. 以下是代码的草图:

    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");
    
    }
    

答案 1 :(得分:1)

管理以解决这个问题,这就是我所做的;

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 :)
    }
}

答案 2 :(得分:0)

//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();
    }
}

在代码的第一部分中,您跳过了所需的行数,但由于当前显示的格式,它们不会影响您的比较

答案 3 :(得分:-1)

使用文件A内容填充字典对象,然后遍历文件B内容查询文件字典对象。如果您有大量数据,字典对象的原因就是它的速度。

Dictionary<int, string> FileA = new Dictionary<int, string>();
string sFileAList = dataFileA;

循环文件A内容并添加到Dict,其中我是一个计数器。

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
    }
}