2015-12-01 3 views
0

Я пытаюсь удалить некоторые нежелательные предложения (в данном случае предложения с менее чем 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

Не следует ли вызов «SaveToFile()» или некоторые такие где-нибудь? –

+3

Вы используете одно и то же имя файла для каждого обрабатываемого файла - вы его никогда не изменяете. Кроме того, вам не нужно вызывать 'ToArray()' - вы можете использовать 'foreach' в' List 'просто как массив. – Tim

+1

Проверьте эти два метода: [ReadAllLines] (https://msdn.microsoft.com/en-us/library/s2tte0y1 (v = vs.110) .aspx) и [WriteAllLines] (https://msdn.microsoft. ком/EN-US/библиотека/92e05ft3 (v = vs.110) .aspx). Они могут помочь вам сделать код более читаемым. –

ответ

3

Вы назначаете myUniqueFileaname только за пределами цикла. Таким образом, один и тот же файл перезаписывается каждый раз.

3

Вы создаете имя выходного файла один раз, в начале программы.

Очевидно, что вам нужно создать его один раз для каждого файла - так перенесите код

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

в петлю.

+0

Ничего себе, привязка ко второму для ответа на вопрос. Не видел этого раньше. –

+0

О да! Не видел! Большое спасибо Никки, Гэри и Бен за самый быстрый ответ! – JuanLuis

4

При создании StreamWriter объекта, чтобы написать вывод, вы делаете это с:

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

где myUniquefilename является string = string.Format(@"{0}.txt", Guid.NewGuid());

Проблема заключается в том что вы не генерируя новое имя файла каждый раз. Таким образом, вы переписываете каждый файл с последним. Вы должны генерировать новое имя файла каждый раз, возможно, копируя назначение в цикле.

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

Это решение по-прежнему будет иметь ту же проблему, что и вопрос OP - вы получите только один файл, потому что имя выходного файла никогда не изменяется. – Tim

+1

@Tim На самом деле это не из-за 'string.Format'. – juharr

+0

Вам не нужен 'ToArray', поскольку' File.WriteAllLines' имеет перегрузку, которая будет принимать 'IEnumerable '. – juharr