如何复制文本文件的特定部分

时间:2018-07-09 14:25:20

标签: c# .net text

我的目标是将.txt文件的特定内容复制到1个大文本文件中。我搜索了整个网站,发现了一种合并文件的方法。

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}

此答案发布者:n8wrl

我的文字结构如下:

  

...

     

句子A

     

重要的东西

     

句子B

     

...

因此,我需要一种方法来搜索文档中的"Sentence A""Sentence B"并复制这两者之间的行。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

请考虑以下文章中的选项:Fastest way to search string in large text file来查找所需的开始和结束句子,并在子字符串中使用这些位置(第一行的开头和第二行的结尾)。

确保测试以下情况:第二句出现在第一句之前,第二句出现两次(是否要在第一句和第二句第二次出现之间的文本?)以及第二句没有第二句。然后考虑第一句话的类似情况(例如,如果它出现在第二句之后,是否出现多次,以及在第二句出现时根本没有出现)。

答案 1 :(得分:1)

假设"Sentence A""Sentence B"都在整行中,则可以尝试使用简单的 Linq 。让我们首先提取“重要的东西”:

private static IEnumerable<string> Staff(string file) 
{
    return File
        .ReadLines(file)
        .SkipWhile(line => line != "Sentence A")  // Skip until Sentence A found 
        .Skip(1)                                  // Skip Sentence A itself
        .TakeWhile(line => line != "Sentence B"); // Take until Sentence B found 
}

然后将所有文件合并为一个:

string[] files = new[] 
{
    "file1", "file2", "file3"
};

var extracts = files.SelectMany(file => Staff(file));

最后,让我们将所有extracts写入文件:

File.WriteAllLines("output", extracts);

编辑:如果您有合并的文件(“重要内容”可能出现几次次),我们必须实施 FSM (有限状态机):

private static IEnumerable<string> Staff(string file) 
{
    bool important = false;

    foreach (string line in file.ReadLines(file)) 
    {
        if (important) 
            if (line == "Sentence B")
                important = false;
            else
                yield return line;
        else 
            important = line == "Sentence B"; 
    }
} 

请注意,我们必须扫描整个文件,这就是为什么我们应该避免文件合并。

答案 2 :(得分:0)

您需要这样的东西:

var sentenceA = "Sentence A";
var sentenceB = "Sentence B";
using (var output = System.IO.File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            var reader = new System.IO.StreamReader(input);
            var text = reader.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToString();
            if (text.Contains(sentenceA) && text.Contains(sentenceB)) {
                output.Write(text.Substring(text.IndexOf(sentenceA), text.IndexOf(sentenceB) + sentenceB.Length));
            }
        }
    }
}