我有一个大小为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));
}
答案 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
。您可以找出想要一次的列,适当修剪标题,然后按此方式进行过滤。