1

私はのリストを持っていますtokens

 [@date]
 [@time]
 [@fileName]
 ... etc

それは大きなファイル全体に分散しています。Regex.Replace行にトークンが 1 つしかない場合は、ファイルを解析して簡単に置き換えることができます。
ただし、1 行の例に 2 つのトークンがある場合に問題が発生します。

[@date] [@time]

私がやろうと思ったのは、 with を使用String.Splitして" " as the delimiter、トークンがあるかどうかを確認する結果を反復処理することです。

しかし、このアプローチには 2 つの問題があります。ファイルがかなり大きく、パフォーマンスに確実に影響します。2 つ目の問題は、出力されるファイルがSQLファイルであり、見た目だけのために空白を保持したいということです。

この問題に対するよりエレガントな解決策はありますか? それとも時期尚早の最適化の別のケースですか?

4

3 に答える 3

1

これを行う簡単な方法の 1 つは、トークンとその値を別々に保存してから、クエリをそのトークンの値に置き換えて反復処理することです。以下に例を示します。

var tokensWithValues = new Dictionary<string, object>()
{
    {"[@date]", DateTime.Now},
    {"[@time]", DateTime.Now.Ticks},
    {"[@fileName]", "myFile.xml"},
};

var sqlQuery = File.ReadAllText("mysql.sql");

foreach (var tokenValue in tokensWithValues)
{
    sqlQuery = sqlQuery.Replace(tokenValue.Key, tokenValue.Value.ToString());
}
于 2013-05-21T23:30:00.937 に答える
0

string.Replace(...) 拡張機能を使用してみてください。これにより、文字列のすべてのインスタンスを置き換えることができます。

例えば

string file = File.ReallAllText("myfile.txt");


file.Replace("[@date]", "replaced_value");

上記は、「[@date]」のすべてのインスタンスを「replaced_value」に置き換えます。

前の回答には、OP で使用できないカスタム拡張機能が含まれていたため編集されました。ありがとうリヤ。

于 2013-05-21T23:15:51.853 に答える