【问题标题】:How to copy a specific part of a text file如何复制文本文件的特定部分
【发布时间】:2018-07-09 14:25:19
【问题描述】:

我的目标是将 .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" 并复制这两者之间的行。

感谢您的帮助!

【问题讨论】:

  • 使用File.ReadLines(),则可以使用Linq查询数据
  • 实现流包装器,它会寻找特定的句子结尾,然后读取所有相关部分,直到另一个句子开始......或者用 ReadLine 做简单的逐行操作来识别所需的位置。
  • @bommelding 它小于 1MB。

标签: c# .net text


【解决方案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"; 
    }
} 

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

【讨论】:

  • 感谢您的回答!您认为先从每个文件中提取重要内容然后从中制作一个文件还是先合并文件然后再提取会更有益?因为“Sentence A”和“Sentence B”在每个文件中出现一次。
  • @Botond:在上面的代码中,我一个接一个地处理文件;我怀疑将文件合并为一个是否有益:如您所见,我利用了员工只出现一个这一事实(Skip...Take);如果文件被合并,我们必须实现具有两种状态的 FSM(有限状态机):in/out of the staff。另一个缺点是我们希望尽可能早地离开文件(假设重要的人员在每个文件的顶部),如果文件合并我们不能这样做
  • 我现在明白了。感谢您的所有帮助!
【解决方案2】:

考虑这篇文章中的选项:Fastest way to search string in large text file 要找到你想要的开始和结束句子的内容,在子字符串中使用这些位置(第一个开始和第二个结束)。

确保您测试第二个句子出现在第一个句子之前、它出现两次的情况(您想要第一个句子和第二个句子的第二个出现之间的文本吗?)以及没有第二个句子的情况.然后考虑第一个句子的类似情况(例如,如果它出现在第二个句子之后,如果它出现不止一次,如果它在第二个句子出现时根本不出现)。

【讨论】:

  • 它出现的唯一情况是第一句然后是第二句。它在合并的文本文件中发生多次,因为它在我合并的每个文本文件中发生一次!感谢您的答案,我正在搜索您链接的帖子!
【解决方案3】:

你需要这样的东西:

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

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多