我试图从不同的本地文件中删除一些不需要的句子(在这种情况下,少于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!");
但是这样我只设法保存最后处理过的文档,而不是将几个已清理的文本文件作为输出。我在这里做错了什么?
提前致谢。
答案 0 :(得分:4)
创建StreamWriter
对象以编写输出时,可以使用:
StreamWriter writer = new StreamWriter(@"C:\output\" + myUniquefilename);
其中myUniquefilename
是string
= string.Format(@"{0}.txt", Guid.NewGuid());
问题是您每次都没有生成新的文件名。所以你用最后一个文件覆盖每个文件。您需要每次都生成一个新的文件名,可能会将赋值复制到循环中。
答案 1 :(得分:3)
您只在循环外部分配一次myUniqueFileaname。因此每次都会覆盖同一个文件。
答案 2 :(得分:3)
您可以在程序开头生成一次输出文件名。
显然,你需要为每个文件生成一次 - 所以移动代码
var myUniquefilename = string.Format(@"{0}.txt", Guid.NewGuid());
进入循环。
答案 3 :(得分:1)
这应该做你想要实现的目标
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);
}