2017-04-07 44 views
-4

我有一個csv文件,我需要根據文件的前兩個字符添加一個唯一的ID。我有以下代碼:如何編輯文件,在開頭添加數據,而不用重寫整個文件?

using (StreamReader sr = new StreamReader(f)) 
        { 
         string currentLine; 
         int id = 0; 

         while ((currentLine = sr.ReadLine()) != null) 
         { 
          string row = currentLine.ToString(); 
          string FirstTwoCharacters = currentLine.Substring(0, 2); 


          if (FirstTwoCharacters == "01") 
          { 
           id = id + 1; 
           row += "*" + id.ToString(); 

           using (StreamWriter files = File.AppendText(dir + newfilename)) 
           { 
            files.WriteLine(row); 
           } 
          } 
          else 
          { 
           row += "*" + id.ToString(); 

           using (StreamWriter files = File.AppendText(dir + newfilename)) 
           { 
            files.WriteLine(row); 
           } 
          } 

         } 
        } 

csv文件可能很大,1Gb大小,大約600萬行。只是需要建議,如果有更快的方法來處理這個問題,目前可能需要3個多小時來處理一個文件,並且可以一次接收多個文件。

+1

塊之外的數據,而不是寫入每行的文件。這是很大的開銷。 – Jonesopolis

+1

string row = currentLine.ToString(); ... string ToString? – EpicKip

+0

將字符串轉換爲字符串,使得絕對可靠,或者只是一些錯誤的代碼......您決定。 – Leonidas199x

回答

0

打開(File.AppendText)裏面的while環是昂貴的,這個移動的while

using (StreamReader sr = new StreamReader(f)) 
{ 
       string currentLine; 
       int id = 0; 
       using (StreamWriter files = File.AppendText(dir + newfilename)) 
       { 
        while ((currentLine = sr.ReadLine()) != null) 
        { 
         string row = currentLine.ToString(); 
         string FirstTwoCharacters = currentLine.Substring(0, 2); 


         if (FirstTwoCharacters == "01") 
         { 
          id = id + 1; 
          row += "*" + id.ToString(); 

          files.WriteLine(row); 

         } 
         else 
         { 
          row += "*" + id.ToString(); 

          files.WriteLine(row); 

         } 

        } 
       } 
      } 
+0

這已經排序我出來,這是一個要記住。謝謝! – Leonidas199x

1

相反的附加線路輸入文件可以保留流作家的每一行打開新文件的打開:

using (StreamReader sr = new StreamReader(f)) 
using (StreamWriter files = File.AppendText(dir + newfilename)) 
{ 
    string currentLine; 
    int id = 0; 

    while ((currentLine = sr.ReadLine()) != null) 
    { 
     string firstTwoCharacters = currentLine.Substring(0, 2); 

     if (firstTwoCharacters == "01") 
      id++; 

     files.WriteLine(currentLine + "*" + id); 
    } 
} 

您還可以使用File.ReadLines枚舉源線:

using (StreamWriter writer = File.AppendText(dir + newfilename)) 
{ 
    int id = 0; 

    foreach(var line in File.ReadLines(f)) 
    { 
     if (line.Substring(0,2) == "01") 
      id++; 

     writer.WriteLine($"{line}*{id}"); 
    } 
} 

或者即使是LINQ方法

int id = 0; 
var newLines = from line in File.ReadLines(f) 
       let incrementId = line.Substring(0,2) == "01" 
       select $"{line}*{incrementId ? (++id) : id}"; 

File.WriteAllLines(dir + newfilename, newLines); 
相關問題