0

数GBのサイズのタブ区切りのテキストファイルがあります。ここでのタスクは、各列にヘッダーテキストを追加することです。今のところ、StreamReaderを使用して行ごとに読み取り、各列にヘッダーを追加しています。今のところかなり時間がかかります。それを速くする方法はありますか?ファイルを列単位で処理する方法があるかどうかを考えていました。1つの方法は、データベーステーブルにファイルをインポートし、ヘッダーを追加した後にデータをbcpアウトすることです。おそらくPowerShellをC#コードで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() + "&";
}

...ループで文字列の連結を使用していますが、列の数が多いと遅くなります。を使用するStringBuilderと、より効率的になる可能性が非常に高くなります。Trim()さらに、すべての行のすべての文字列を呼び出す必要はありませんfileHeaders。必要な列を一度作成し、ヘッダーを適切にトリミングして、そのようにフィルタリングするだけです。

于 2012-09-11T13:56:48.827 に答える