一括挿入を使用してレポート用に IIS ログを SQL にインポートしたいのですが、コメント行 (# で始まる行) が問題を引き起こします。これらの行にはデータ行と同じ番号のフィールドがないためです。
コメントを手動で削除した場合は、一括挿入を実行できます。
次のような一致に基づいて行を除外しながら、一括挿入を実行する方法はありますか: 「#」が付いている行。
ありがとう。
一括挿入を使用してレポート用に IIS ログを SQL にインポートしたいのですが、コメント行 (# で始まる行) が問題を引き起こします。これらの行にはデータ行と同じ番号のフィールドがないためです。
コメントを手動で削除した場合は、一括挿入を実行できます。
次のような一致に基づいて行を除外しながら、一括挿入を実行する方法はありますか: 「#」が付いている行。
ありがとう。
私が不規則なデータで一般的に使用するアプローチは、受信データを単一の列BULK INSERT
を持つ一時的なステージング テーブルにプッシュすることです。VARCHAR(MAX)
そこにあると、SQL クエリや文字列関数などのより柔軟な意思決定ツールを使用して、ステージング テーブルからどの行を選択し、メイン テーブルに取り込むかを決定できます。これはBULK INSERT
、特定のファイルで失敗する理由と方法について非常に不可解な場合があるため、役立ちます。
私が考えることができる他の唯一のオプションは、一括挿入を行う前に、アップロード前のスクリプトを使用して、表の基準に合わないコメントやその他の行をトリミングすることです。
Microsoft には「PrepWebLog」というツールがありますhttp://support.microsoft.com/kb/296093 - これらのハッシュ/ポンド文字を取り除きますが、私は現在それを実行しています (複数のファイルに PowerShell スクリプトを使用しています)。そのパフォーマンスが耐えられないほど遅いことがわかります。
C# プログラム (またはマクロ) を作成した方が速いと思います。
更新: PrepWebLog がクラッシュしました。私はそれを避けるだろう。
更新 #2、PowerShell の Get-Content コマンドと Set-Content コマンドを見ましたが、構文と可能なパフォーマンスが気に入らなかったのです。そこで、この小さな C# コンソール アプリを作成しました。
if (args.Length == 2)
{
string path = args[0];
string outPath = args[1];
Regex hashString = new Regex("^#.+\r\n", RegexOptions.Multiline | RegexOptions.Compiled);
foreach (string file in Directory.GetFiles(path, "*.log"))
{
string data;
using (StreamReader sr = new StreamReader(file))
{
data = sr.ReadToEnd();
}
string output = hashString.Replace(data, string.Empty);
using (StreamWriter sw = new StreamWriter(Path.Combine(outPath, new FileInfo(file).Name), false))
{
sw.Write(output);
}
}
}
else
{
Console.WriteLine("Source and Destination Log Path required or too many arguments");
}
それはかなり速いです。