The biggest performance hit is every time a line is read, the entire file (processed so far) is written back to disk. For a quick win, try moving the StringBuilder out of the loop:
System.Text.StringBuilder builder = new System.Text.StringBuilder(); using (FileStream stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader streamReader = new StreamReader(stream)) { while (!streamReader.EndOfStream) { var line = streamReader.ReadLine(); var values = line.Split(','); DateTime dt = new DateTime(); DateTime.TryParse(values[2], out dt); values[2] = Convert.ToString(dt.Ticks); string[] output = new string[values.Length]; bool firstColumn = true; for (int index = 0; index < values.Length; index++) { if (!firstColumn) builder.Append(','); builder.Append(values[index]); firstColumn = false; } builder.AppendLine(); } } } File.WriteAllText(args[1], builder.ToString());
If you want to reorganize a further change in the comma separation logic:
System.Text.StringBuilder builder = new System.Text.StringBuilder(); using (FileStream stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader streamReader = new StreamReader(stream)) { while (!streamReader.EndOfStream) { var line = streamReader.ReadLine(); var values = line.Split(','); DateTime dt = new DateTime(); DateTime.TryParse(values[2], out dt); values[2] = Convert.ToString(dt.Ticks); builder.AppendLine(string.Join(",", values)); } } } File.WriteAllText(args[1], builder.ToString());
Edit: To avoid memory usage, uninstall Stringbuilder and use another FileStream to write to disk. Your proposed solution (using List ) will still use a significant amount of memory and will probably break larger files:
using (FileStream input = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (FileStream output = File.Create(args[1])) { using (StreamReader streamReader = new StreamReader(input)) using (StreamWriter streamWriter = new StreamWriter(output)) { while (!streamReader.EndOfStream) { var line = streamReader.ReadLine(); var values = line.Split(','); DateTime dt = new DateTime(); DateTime.TryParse(values[2], out dt); values[2] = Convert.ToString(dt.Ticks); streamWriter.WriteLine(string.Join(",", values)); } } }