0

新しいファイルを作成するために削減したい多くの数値を含むファイルがあります。まず、 を使用してすべてのテキストを抽出しFile.ReadAllText、カンマまたはスペースで区切られた数字を含む各行から数字を分割して抽出します。スキャン後、見つかった各数値のすべての出現を新しい縮小された数値に置き換えますが、問題は、一部の数値が複数回置き換えられるため、この方法はエラーが発生しやすいことです

私が使用しているコードは次のとおりです。

List<float> oPaths = new List<float>();
List<float> nPaths = new List<float>();
var far = File.ReadAllText("paths.js");
foreach(var s in far.Split('\n'))
{
    //if it starts with this that means there are some numbers
    if (s.StartsWith("\t\tpath:"))
    {
        var paths = s.Substring(10).Split(new[]{',', ' '});
        foreach(var n in paths)
        {
            float di;
            if(float.TryParse(n, out di))
            {
                if(oPaths.Contains(di)) break;
                oPaths.Add(di);
                nPaths.Add(di * 3/4);
            }
        }
    }
}

//second iteration to replace old numbers with new ones
var ns = far;
    for (int i = 0; i < oPaths.Count; i++)
    {
        var od = oPaths[i].ToString();
        var nd = nPaths[i].ToString();
        ns = ns.Replace(od, nd);
    }
    File.WriteAllText("npaths.js", ns);

ご覧のとおり、上記の方法はリアルタイムで文字列を置き換えないため冗長です。頭がいっぱいなのかもしれませんが、どうしたらいいのか迷っています。何か案は?

ありがとう。

4

2 に答える 2

2

ここで正規表現が役立つと思います

string text = File.ReadAllText(file);
string newtext = Regex.Replace(text, @"\b(([0-9]+)?\.)?[0-9]+\b", m =>
    {
        float f;
        if (float.TryParse(m.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out f)) f *= 3.0f / 4;
        return f.ToString();
    });
File.WriteAllText(file, newtext);
于 2012-09-08T22:04:30.810 に答える
0

質問を入力した直後に、答えは文字ごとに繰り返し、それに応じて置き換えることであることに気付きました。これを機能させるために使用したコードは次のとおりです。

string nfar = "";
var far = File.ReadAllText("paths.js");
bool neg = false;
string ccc = "";
for(int i = 0; i < far.Length; i++)
{
    char c = far[i];
    if (Char.IsDigit(c) || c == '.')
    {
        ccc += c;
        if (far[i + 1] == ' ' || far[i + 1] == ',')
        {
            ccc = neg ? "-" + ccc : ccc;
            float di;
            if (float.TryParse(ccc, out di))
            {
                nfar += (di*0.75f).ToString();
                ccc = "";
                neg = false;
            }
        }
    }
    else if (c == '-')
    {
        neg = true;
    }
    else
    {
        nfar += c;
    }
}
File.WriteAllText("nfile.js", nfar);

コメントや最適化の提案を歓迎します。

于 2012-09-08T20:56:28.660 に答える