lastr2d2
lastr2d2

Reputation: 3968

Replace one specific line in a huge text file

I want to replace one specific line in a text file. The simplest solution would be:

public void ModifyFile(string path, int line, string targetText) {
    var lines = File.ReadAllLines(path);
    lines[line] = targetText;
    File.WriteAllLines(path, lines);
}

The thing is, if the file is huge enough, I will get a System.OutOfMemoryException because File.ReadAllLines() tries to load the whole file in memory, instead of a line-by-line way.

I know there is another way to read a specific line with less memory cost:

var line = File.ReadLines(path).Skip(line-1).Take(1).ToString();

How can I replace over that line in the file?

I'm looking for something like FileStream.Write Method:

var writer = File.OpenWrite(path);
writer.Write(Encoding.UTF8.GetBytes(targetText), 
    offset, Encoding.UTF8.GetByteCount(targetText));

But it's difficult to know offset.

Is there a better way to do that?

-- UPDATE --

The temporary file solution suggested by answers works great.
At the same time, I am wondering, is there a specific case solution without creating a temporary file, if I know line is a small number (line < 100 let's say)? There must be a better solution if I want to change the 10th line in a text file having 100m lines.

Upvotes: 2

Views: 1955

Answers (2)

Code Uniquely
Code Uniquely

Reputation: 6373

You could just read the file a line at a time using streams, and copy the contents into a new file, or rename the old file with a backup name and then process with;

string line;
int couinter = 0;

// Read the file and display it line by line.
System.IO.StreamReader reader = new System.IO.StreamReader(path);
System.IO.StreamWriter writer = new System.IO.StreamWriter(new_path);

while((text = reader.ReadLine()) != null)
{
   // Check for your content and replace if required here  
   if ( counter == line ) 
      text = targetText;

   writer.writeline(text);
   counter++;
}

reader.Close();
writer.Close();

Upvotes: 4

Shiplu Mokaddim
Shiplu Mokaddim

Reputation: 57650

What you can do is open the FileStrem with StreamReader (which provides ReadLine method). Now read line by line and write the output to a temporary file line by line. When you are on the desired line just change the line.

Upvotes: 2

Related Questions