我正在尝试做的是打开一个巨大的文件列表(大约40k记录,并在包含2百万条记录的文件中的一行上匹配它们。如果文件A中的行与文件B中的行匹配写出那条线。
文件A包含一堆没有扩展名的文件,文件B包含完整的文件路径,包括扩展名。
我正在使用这个,但我不能让它去......
string alphaFilePath =(@“C:\ Documents and Settings \ g \ Desktop \ Arrp \ Find \ natst_ready.txt”);
List<string> alphaFileContent = new List<string>();
using (FileStream fs = new FileStream(alphaFilePath, FileMode.Open))
using (StreamReader rdr = new StreamReader(fs))
{
while (!rdr.EndOfStream)
{
alphaFileContent.Add(rdr.ReadLine());
}
}
string betaFilePath = @"C:\Documents and Settings\g\Desktop\Arryup\Find\eble.txt";
StringBuilder sb = new StringBuilder();
using (FileStream fs = new FileStream(betaFilePath, FileMode.Open))
using (StreamReader rdr = new StreamReader(fs))
{
while (!rdr.EndOfStream)
{
string betaFileLine = rdr.ReadLine();
string matchup = Regex.Match(alphaFileContent, @"(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(.*)(\.)").Groups[9].Value;
if (alphaFileContent.Equals(matchup))
{
File.AppendAllText(@"C:\array_tech.txt", betaFileLine);
}
}
}
这不起作用,因为alphafilecontent只是一行而且我很难弄清楚如何让我的正则表达式在包含所有文件路径的文件上工作(Betafilepath)
这是beta文件路径的示例。
C:\ arres_i \ GRN \奥拉\ SEC \ DBZ_EX1 \ Nes的\ 001 \ DZO-EX00001.txt
以下是我试图与我的alpha进行比较的行 DZO-EX00001
答案 0 :(得分:3)
使用System.IO.Path.GetFileNameWithoutExtension而不是正则表达式。
static void Compare(string alpha, string beta)
{
HashSet<string> alphaContent = new HashSet<string>();
StreamReader reader = new StreamReader(alpha);
while (!reader.EndOfStream)
alphaContent.Add(reader.ReadLine());
reader.Close();
reader = new StreamReader(beta);
while (!reader.EndOfStream)
{
string fullpath = reader.ReadLine();
string filename = Path.GetFileNameWithoutExtension(fullpath);
if (alphaContent.Contains(filename))
{
File.AppendAllText(@"C:\array_tech.txt", fullpath);
}
}
reader.Close();
}
答案 1 :(得分:0)
因此,您阅读测试版中的所有行,并将整个内容存储在字符串beta
中。
接下来,您从alpha中读取一行,并将DZO-EX00001
存储在字符串alpha
中。
var pattern = @"^.*" + alpha + ".*$";
var match = Regex.Match(beta, pattern, RegexOptions.Multiline);
if(match.Success)
{
string filepath = match.Value;
// do stuff
}
您需要先从测试版中加载所有行。然后你可以从alpha检查每一行。
您必须指定RegexOptions.Multiline
以检查beta
中的所有行(以便^
和$
在每一行都匹配,而不是在开头和结尾整个字符串。
如果您需要更具体,可以扩展模式;因为它只是获取包含文件名的第一行。