在C#中逐列附加文本制表符分隔的文本文件

时间:2012-09-11 13:51:36

标签: c#-4.0 large-files streamreader

我有一个大小为GB的制表符分隔文本文件。这里的任务是将标题文本追加到每一列。截至目前,我使用StreamReader逐行读取并将标题附加到每列。到目前为止需要很多时间。有没有办法让它更快?我在想是否有办法按列处理文件。一种方法是在数据库表中导入文件,然后在附加标题后bcp输出数据。有没有其他更好的方法,可能是通过在C#代码中调用powershell,awk / sed?

代码如下:

  StreamReader sr = new StreamReader(@FilePath, System.Text.Encoding.Default);
  string mainLine = sr.ReadLine();
  string[] fileHeaders = mainLine.Split(new string[] { "\t" }, StringSplitOptions.None);
  string newLine = "";

  System.IO.StreamWriter outFileSw = new System.IO.StreamWriter(@outFile);

  while (!sr.EndOfStream)
  {
     mainLine = sr.ReadLine();
     string[] originalLine = mainLine.Split(new string[] { "\t" }, StringSplitOptions.None);

     newLine = "";
     for (int i = 0; i < fileHeaders.Length; i++)
     {
          if(fileHeaders[i].Trim() != "")
           newLine = newLine + fileHeaders[i].Trim() + "=" + originalLine[i].Trim() + "&";
     }

 outFileSw.WriteLine(newLine.Remove(newLine.Length - 1));
 }

1 个答案:

答案 0 :(得分:2)

其他任何只运行文本文件的内容都会明显加快 - 从根本上说,你 来阅读整个输入文件,而你得到了创建一个全新的输出文件,因为你不能为每一列“插入”文本。

一般来说,使用数据库几乎肯定是一个更好的主意,但添加一个列仍然可能最终成为一个相对缓慢的业务。

但是,您可以改善处理每条线的方式。在这段代码中:

for (int i = 0; i < fileHeaders.Length; i++)
{
    if(fileHeaders[i].Trim() != "")
         newLine = newLine + fileHeaders[i].Trim() + "=" + originalLine[i].Trim() + "&";
}

...你在循环中使用字符串连接,如果存在大量列,则会很慢。使用StringBuilder非常有效。此外,无需在每行Trim()上的每个字符串上调用fileHeaders。您可以找出想要一次的列,适当修剪标题,然后按此方式进行过滤。