2012-09-08 215 views
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); 

正如你所看到的,上面的方法是多餘的,因爲它不能實時替換字符串。也許我的頭已滿,但我對如何解決這個問題感到失落。有任何想法嗎?

謝謝。

回答

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); 
+0

高超,比我更快。謝謝 –

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); 

歡迎評論和/或優化建議。