2016-12-16 4 views
0

У меня есть один большой файл, который структурирован что-то вроде этого:File.AppendText() Медленное

Report 1 section 1 
Report 2 section 1 
Report 1 section 2 
Report 3 section 1 
Report 2 section 2 
and so on.... 

я должен поставить все 1s вместе, все вместе 2s, и т.д., в отчет 1, отчет 2 , Report 3. У меня нет выбора, кроме как идти по строкам. Проблема в том, что она очень медленная. Вот код, я использую для записи файлов:

 using (StreamWriter sw = File.AppendText(newFileName)) 
        { sw.WriteLine(line); } 

Я думаю, что проблема в том, что File.AppendText() замедляет этот процесс. Мне интересно, есть ли у кого-нибудь идеи о том, как ускорить это.

+2

Вы имеете в виду, что вы открываете файл для каждой отдельной строки? Не делай этого. (И не форматируйте исходный код, как это, в идеале ...) Откройте файл один раз, прямо все строки. –

+0

Я не могу этого сделать, потому что файлы огромны, и я должен их читать по строкам :(Некоторые строки нужно манипулировать. – Missy

+1

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

ответ

3

Кажется, что вы открываете этот файл для каждой итерации. Попробуйте это:

using (StreamWriter sw = File.AppendText(path)) 
{ 
    while (condition) 
    { 
     sw.WriteLine("write your line here"); 
    } 
} 

Как Крис Бергер прокомментировал, вы можете гнездо usings как этот

using (StreamWriter sw1 = File.AppendText(path1)) 
{ 
    using (StreamWriter sw2 = File.AppendText(path2)) 
    { 
     while (condition) 
     { 
      if(writeInFile1) 
       sw1.WriteLine("write your line here"); 
      else 
       sw2.WriteLine("write your line here"); 
     } 
    } 
} 
+0

Это хорошее решение, однако у меня будет пять или шесть файлов отчетов, поступающих из одного файла. Я попробую его и посмотрю, смогу ли я сделать он работает. – Missy

+1

@ Missy - затем сортируйте строки сначала и записывайте их все в один файл за раз (по одной записи на выходной файл), если это возможно. – ps2goat

+2

Вы можете вложить свои приложения, чтобы открыть сразу несколько файлов, если это необходимо. Было бы очень неприятно иметь 5 файлов, открытых во время работы с кодом и обработки, но это, вероятно, лучше, чем альтернатива. Редактировать: Или, как говорит ps2goat, сначала сгруппируйте строки и напишите их к одному файлу за раз. –

1

Как упоминалось в Facundo's answer

Это хорошее решение, однако, у меня будет пять или шесть файлов отчетов, поступающих из одного файла ...

Вы можете открыть все 6 файлов одновременно, используя несколько операторов using.

using (StreamReader sr = File.OpenText(source) 
using (StreamWriter sw1 = File.AppendText(path1)) 
using (StreamWriter sw2 = File.AppendText(path2)) 
using (StreamWriter sw3 = File.AppendText(path3)) 
using (StreamWriter sw4 = File.AppendText(path4)) 
using (StreamWriter sw5 = File.AppendText(path5)) 
using (StreamWriter sw6 = File.AppendText(path6)) 
{ 
    string line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     if(line.StartsWith("Report 1") 
     { 
      sw1.WriteLine(line); 
     } 
     else if(line.StartsWith("Report 2") 
     { 
      sw2.WriteLine(line); 
     } 
     else if(line.StartsWith("Report 3") 
     { 
      sw3.WriteLine(line); 
     } 
     else if(line.StartsWith("Report 4") 
     { 
      sw4.WriteLine(line); 
     } 
     else if(line.StartsWith("Report 5") 
     { 
      sw5.WriteLine(line); 
     } 
     else if(line.StartsWith("Report 6") 
     { 
      sw6.WriteLine(line); 
     } 
     else 
     { 
      throw new InvalidDataException($"Line does not start with a report number: \n{line}"); 
     } 
    } 
} 
Смежные вопросы