如何从文件中删除不需要的句子

How to remove unwanted sentences from file

我正在尝试从不同的本地文件中删除一些不需要的句子(在本例中是少于 6 个单词的句子),并将清理后的文本保存到另一组文件中。所以我试图一个一个地读取文件夹中的每个文件,并将所有有效的句子写入位于另一个文件夹中的另一组文件中。我目前正在使用此代码:

int shortphrasescount = 0;    
var myUniquefilename = string.Format(@"{0}.txt", Guid.NewGuid()); 
string[] files = Directory.GetFiles(@"C:\input\")
                          .Where(p => p.EndsWith(".txt"))
                          .ToArray();
foreach (var file in files)
{

    StreamReader reader = new StreamReader(file);
    StreamWriter writer = new StreamWriter(@"C:\output\" + myUniquefilename);
    writer.Flush();

    var list = new List<string>();
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        list.Add(line);
    }
    string[] sentences = list.ToArray();

    foreach (var sentence in sentences)
    {

        int NumberOfWords = sentence.Split(' ').Length;
        if (NumberOfWords < 6)
        {
            shortphrases += 1;
        }
        else
        {          
            writer.WriteLine(sentence);
        }
    }

    writer.Close();
    reader.Close();
}                    

Console.WriteLine("Deleted a total of " + shortphrasescount + " short phrases!");

但通过这种方式,我只能保存最后处理的文档,而不是将几个清理过的文本文件作为输出。我在这里做错了什么?

提前致谢。

您只能在循环外分配一次 myUniqueFileaname。所以每次都会覆盖同一个文件。

您在程序开始时生成一次输出文件名。

显然,您需要为每个文件生成一次 - 所以移动代码

var myUniquefilename = string.Format(@"{0}.txt", Guid.NewGuid()); 

进入循环。

当您创建 StreamWriter 对象来写入输出时,您可以使用:

StreamWriter writer = new StreamWriter(@"C:\output\" + myUniquefilename);

其中 myUniquefilenamestring = string.Format(@"{0}.txt", Guid.NewGuid());

问题是您不是每次都生成新的文件名。所以你用最后一个文件覆盖每个文件。您需要每次都生成一个新文件名,也许将分配复制到循环中。

这应该可以实现您想要实现的目标

var myUniquefilename = @"C:\OutputDirectory\{0}_NEW.txt";
string[] files = Directory.GetFiles(@"C:\InputDirectory\", "*.txt");

foreach (var file in files)
{
    var lines = File.ReadAllLines(file);
    var validLines = lines.Where(l => l.Split(' ').Length > 6);
    File.WriteAllLines(string.Format(myUniquefilename, Path.GetFileNameWithoutExtension(file)), validLines);
}