C# 使用正则表达式将多个 .txt 文件合并为一个 .txt 文件

c# merging multiple .txt files into one .txt file with regex

提问人:shorty 提问时间:3/27/2022 最后编辑:Andrew Mortonshorty 更新时间:3/27/2022 访问量:95

问:

我有一个巨大的问题。我需要将两个 .txt 文件合并为第三个文件,每行一行。在此之前,我需要修剪第一个文件最后两个字符的每一行末尾,并修剪第二个文件的前两个字符。在合并之前,我必须在第一个文件的末尾和第二个文件的开头找到匹配项。也就是说,第一个文件应该是句子的左部分,第二个文件应该是句子的右部分。例:

文件 1 内容(第一行):

很久以前,我们的银河系有一个真正多事之秋:介于

文件 2 内容(第一行):

多事之秋:在大约130亿到80亿年前,它艰难而快速地生活着,与其他星系合并并消耗大量氢气形成恒星。

文件 3 的内容应为(第一行):

很久以前,我们的银河系有一个真正多事的生命:大约在130亿到80亿年前,它艰难而快速地生活着,与其他星系合并并消耗大量氢气形成恒星。

因此,简而言之,我必须在这个文本示例中从第二个文件修剪“多事之秋:之间”,并修剪第一个文件的最后两个和第二个文件的最后两个,并最终将第一个和第二个文件的文本合并到第三个文件中。提前致谢!

namespace ConsoleApplication1

class Program
    {
        
static void Main()
        {
            
            
                
                string[] readleft = File.ReadAllLines(@"C:\Users\J\Desktop\files\left.txt");
                string[] readright = File.ReadAllLines(@"C:\Users\J\Desktop\files\right.txt");
                using (StreamReader swo = new StreamReader(@"C:\Users\J\Desktop\files\left.txt"))
                {
                    //left file is first, second is right and third is output
                    using (StreamReader swot = new StreamReader(@"C:\Users\J\Desktop\files\right.txt"))
                    { 
                        for (int x = 0; x < readleft.Length || x < readright.Length; x++)
                        {
                            Console.WriteLine("{0}{1}",swo.ReadLine(),swot.ReadLine());
                            Match m = Regex.Match(swo.ToString(), swot.ToString());
                            if(m.Success)
                                Console.WriteLine("Found '{0}' at position '{1}'", m.Value.ToString(), m.Index);
                        }
                    }
                }
}
    }

顺便说一句,为什么它向我显示“System.IO.StreamReader”而不是匹配?

C# 正则表达式 匹配

评论

0赞 mashuptwice 3/27/2022
请为您的代码和输入数据使用适当的代码标记,以避免空格和其他字符潜入文本。
0赞 tymtam 3/27/2022
您需要使用正则表达式吗?
0赞 tymtam 3/27/2022
您不需要这些流读取器,您已经拥有 和 中的所有行。readleftreadright

答:

0赞 tymtam 3/27/2022 #1

这是一种易于理解的简单方法。

var left = "A very long ago, our Milky Way had a truly eventful life: between";
var right = "eventful life: between about 13 and 8 billion years ago, it lived hard and fast, merging with other galaxies and consuming a lot of hydrogen to form stars.";

int common = 0;
for(int i = 1; i < Math.Min(left.Length, right.Length); i++)//Please note that a binary search would be much faster
{
    var partToCheck = right.Substring(0,i);
    if(left.EndsWith(partToCheck))
    {
        common = i;
        Console.WriteLine($"Common part: '{right.Substring(0,i)}'");
        break;
    }
}
var merged = left + right.Substring(common);

此打印

Common part: 'eventful life: between'

评论

0赞 shorty 3/27/2022
就是这样!非常感谢!我无法用言语表达很多东西对我来说意味着什么!