我的目标是将.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"
并复制这两者之间的行。
感谢您的帮助!
答案 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));
}
}
}
}