2017-03-10 6 views
0

.NET Core 1.1を使用しており、実行時にテキストファイルを作成する必要があります。例えば:私が行う必要があるテンプレートを使用して実行時にテキストファイルを生成する

import MyLib 

a = 5 
MyLib.doSomeStuff(a) 

唯一のものは、テキストファイルを作成することですが、aの値は、私のC#コードで行われ、いくつかの計算で与えられます。理想的には、私はC#コードでこれに似たものを持っています:

// Variable to pass to be set on the script 
int a = 5; 
// Create the Python script and save to some .py file 
CreatePythonScript(a); 

これは最小の例です。実際には、スクリプトには何百もの変数と数百の変数があるため、Write()という連続した呼び出しでテキストファイルを手作業で書くのは賢明ではありません。

私はT4フレームワークをチェックしましたが、これは私が必要と考えるものではありません。これには何が使えますか?

+1

T4には何が欠けていましたか? –

+0

さて、私はテンプレートを持つテキストファイルを持っていて、そこにいくつかの_placeholders_を持っています。そうすれば、ファイル全体を読み込み、プレースホルダーを値に置き換えて結果を別のファイルに書き込むだけです。 – Pikoh

+0

この[RazorLight](https://github.com)を見てください/ toddams/RazorLight)コアで動作します –

答えて

2

クリーンな定義済みのプレースホルダを使用してサンプルファイルを作成するだけで、それ以降のすべての操作を置き換えることができます。例えば

:だから

import MyLib 

a = `a` 
MyLib.doSomeStuff(a) 

、あなたはそれがそうでない場合は、テキスト内に見つかりませんでした文字列になりようにプレースホルダを挿入することができる方法を見つけるされなければならないので、あなたがいない何をすべきか交換してはならないものを交換してください。この例では、バックティック( `)が決して出現しないと仮定して(私はPythonを全く知らない)、接頭辞、接尾辞、または動的値を挿入する部分に完全にラップするために使用することができます。コメント、文字列リテラルなどの特殊な部分も考慮する必要があります。

もう1つ注目すべきは、ロジックがプレースホルダに優先順位を付ける必要があります。他のプレフィックスのプレースホルダである場合は、最初に長いプレースホルダを置き換える必要があります。そうでない場合は、短いものを置き換えることで長いものを無効にします。接頭辞または接尾辞を付けない場合は、を入れてください。通常は表示されない文字の部分は、別の接頭辞/接尾辞にすることはできません。

これらのことから、私は、テンプレートが単純な場合は単純かつ単純なアプローチを選択することを推奨します。そうでなければ、確かに専用のツールを探すべきです。

例:

Dictionary<string, string> keysAndReplacements = new Dictionary<string, string>(); 

// Initialize the dictionary here. 

// Custom logic to perform key prioritization. More on it below. 
IEnumerable<string> prioritizedKeys = PrioritizeKeys(keysAndReplacements.Keys); 

using (StreamReader reader = new StreamReader(@"C:\sample.txt")) 
{ 
    string allText = reader.ReadToEnd(); 
    foreach (string key in prioritizedKeys) 
    { 
     allText = allText.Replace(key, keysAndReplacements[key]); 
    } 
} 

このロジックは、単に全体のテンプレートを読み込み、値のプレースホルダを置き換えます。辞書のキーは、プレースホルダ(プレフィックスまたは接尾辞またはプレフィックス付き)です。

「以下、その上より」の詳細:

  • 私が言ったように、プレースホルダのための両方の接頭辞と接尾辞がある場合は、その後、(接頭辞と接尾文字を想定してそう思われることはありません)それは不可能です衝突が発生する。
  • キーの長さを降順に並べ替えると、より長いキーが最初に始まるため、プレースホルダがまったく同じ場合にのみ衝突が発生する可能性があります。辞書は重複したキーを許可しないので、同じキーを2回追加しようとすると問題になります。
  • 安全のために、最初と最後に1-1文字を使用しないでください。いくつかのラッパーを使用して、文字列が実際に置き換えられない場所で発生する可能性を減らします。例:§§§a§§§。あまり一般的ではない文字を使用すると、たとえばコメントなど、望ましくないものを置き換える可能性が低くなります。
+0

あなたの答えをありがとう!交換はどのように行うのですか? – manatttta

+0

ありがとうございました。参考のために、これを実行するライブラリはありますか? – manatttta

+0

私は1つを使用する必要がなかったので、私は正確な1つを伝えることができないので、私はそれを私の答えに含めなかったのです。 –

関連する問題