如何从文件中删除不需要的句子
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);
其中 myUniquefilename
是 string
= 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);
}
我正在尝试从不同的本地文件中删除一些不需要的句子(在本例中是少于 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);
其中 myUniquefilename
是 string
= 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);
}