0

我有一个以制表符分隔的文本文件,大小为许多 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));
 }
4

1 回答 1

2

仅对文本文件进行任何操作都不会明显更快 - 从根本上说,您必须阅读整个输入文件,并且您必须创建一个全新的输出文件,因为您不能“插入”文本对于每一列。

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

但是,您可以改进处理每一行的方式。在这段代码中:

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

...您在循环中使用字符串连接,如果有大量列,这会很慢。使用 aStringBuilder很可能更有效。此外,无需调用每一行Trim()的每个字符串fileHeaders。您只需计算出您想要的列一次,适当地修剪标题,然后以这种方式过滤。

于 2012-09-11T13:56:48.827 回答