2017-11-01 6 views
1

私は与えられた場所のファイルのいくつかの文字列を数え、それらの値をいくつかのノードに入れようとしています。 私は以下のコードファイル内の文字列を数え、C#を使用して別の場所に値を入れますか?

var [email protected]"D:\Test\MyFiles"; 
      var files = new List<string>(); 
      if (Directory.Exists(workingPath)) 
      { 
       foreach (var f in Directory.GetDirectories(workingPath, "xml", 
                  SearchOption.AllDirectories)) 
       { 
        files.AddRange(Directory.GetFiles(f, "*.xml")); 
       } 
      } 

      foreach (var file in files) { 
       string text = File.ReadAllText(file); 
       int fig_count = Regex.Matches(text, @"fig id=""fig").Count; 
       int tab_count = Regex.Matches(text, @"table-wrap id=""table").Count; 
       int eq_count = Regex.Matches(text, @"disp-formula id=""deqn").Count; 
       File.WriteAllText(file,Regex.Replace(File.ReadAllText(file), @"<fig-count count=""\d+""/>",@"<fig-count count="""[email protected]"""/>")); 
       File.WriteAllText(file,Regex.Replace(File.ReadAllText(file), @"<table-count count=""\d+""/>",@"<table-count count="""[email protected]"""/>")); 
       File.WriteAllText(file,Regex.Replace(File.ReadAllText(file), @"<eq-count count=""\d+""/>",@"<eq-count count="""[email protected]"""/>")); 
      } 

コードの動作を試してみたが、それは少し冗長です。誰も私に冗長性を減らす方法を教えてもらえますか?

+0

第二にコードレビューのための提案。しかし、最適化はファイルの大きさと一致する一致の数にも依存します。間違いなく、以下の1回だけ書くことをお勧めします。たくさんの小さなファイルがある場合は、Parallel.ForEachを調べてみてください。大量のファイルがあり、1つまたは2つの一致がある場合は、コードをさらに最適化する必要があります。 – NPras

+0

コードのレビューではなく特定の質問のためのサイトですので、このトピックをオフトピックとして閉じるよう投票しています –

答えて

2

一度だけファイルを読み取り、書き込み、以下のコード:

  string text = File.ReadAllText(file); 
      int fig_count = Regex.Matches(text, @"fig id=""fig").Count; 
      int tab_count = Regex.Matches(text, @"table-wrap id=""table").Count; 
      int eq_count = Regex.Matches(text, @"disp-formula id=""deqn").Count; 
      text = Regex.Replace(text, @"<fig-count count=""\d+""/>", @"<fig-count count=""" + fig_count + @"""/>"); 
      text = Regex.Replace(text, @"<table-count count=""\d+""/>", @"<table-count count=""" + tab_count + @"""/>"); 
      text = Regex.Replace(text, @"<eq-count count=""\d+""/>", @"<eq-count count=""" + eq_count + @"""/>"); 
      File.WriteAllText(file, text); 
3

私はTextUpdateの抽出方法を提案し、&を読むのは一度だけファイルを書き込む:

foreach (var file in files) 
{ 
    string text = File.ReadAllText(file); 
    text = UpdateText(text, "fig", Regex.Matches(text, @"fig id=""fig").Count); 
    text = UpdateText(text, "table", Regex.Matches(text, @"table-wrap id=""table").Count); 
    text = UpdateText(text, "eq", Regex.Matches(text, @"disp-formula id=""deqn").Count); 
    File.WriteAllText(file, text); 
} 

private static string UpdateText(string text, string type, int count) 
{ 
    return Regex.Replace(text, "<" + type + @"-count count=""\d+""/>", "<" + type + @"-count count=""" + count + @"""/>"); 
} 
関連する問題