特定の形式のテキスト ファイルがあります。最初に識別子が続き、その後に 3 つのスペースとコロンが続きます。次に、この識別子の値が続きます。
ID1 :Value1
ID2 :Value2
ID3 :Value3
私がする必要があるのは、たとえば検索して新しい値ID2 :
に置き換えることです。これを行う方法は何ですか?解析する必要があるファイルはそれほど大きくなりません。最大で約 150 行になります。Value2
NewValue2
これは、ソースファイルのバックアップも自動的に作成する簡単なソリューションです。
置換はDictionary
オブジェクトに保存されます。これらは行のID(たとえば、「ID2」)でキー設定され、値は必要な文字列の置換です。Add()
必要に応じて追加するだけです。
StreamWriter writer = null;
Dictionary<string, string> replacements = new Dictionary<string, string>();
replacements.Add("ID2", "NewValue2");
// ... further replacement entries ...
using (writer = File.CreateText("output.txt"))
{
foreach (string line in File.ReadLines("input.txt"))
{
bool replacementMade = false;
foreach (var replacement in replacements)
{
if (line.StartsWith(replacement.Key))
{
writer.WriteLine(string.Format("{0} :{1}",
replacement.Key, replacement.Value));
replacementMade = true;
break;
}
}
if (!replacementMade)
{
writer.WriteLine(line);
}
}
}
File.Replace("output.txt", "input.txt", "input.bak");
を、ソース、宛先、およびバックアップファイルへのパスにinput.txt
置き換えるoutput.txt
だけです。input.bak
ファイルがそれほど大きくない場合はFile.ReadAllLines
、すべての行のコレクションを取得してから、探している行を次のように置き換えることができます
using System.IO;
using System.Linq;
using System.Collections.Generic;
List<string> lines = new List<string>(File.ReadAllLines("file"));
int lineIndex = lines.FindIndex(line => line.StartsWith("ID2 :"));
if (lineIndex != -1)
{
lines[lineIndex] = "ID2 :NewValue2";
File.WriteAllLines("file", lines);
}
通常、テキストの検索と置換では、ある種の正規表現を使用することをお勧めしますが、これだけを行っている場合、それは本当にやり過ぎです。
元のファイルと一時ファイルを開くだけです。オリジナルを一度に 1 行ずつ読み、各行で "ID2 :" をチェックします。見つかった場合は、置換文字列を一時ファイルに書き込みます。そうでない場合は、読み取ったものを書き込みます。ソースがなくなったら、両方を閉じて、元のファイルを削除し、一時ファイルの名前を元の名前に変更します。
正規表現を使用して、3行のコードで実行できます
string text = File.ReadAllText("sourcefile.txt");
text = Regex.Replace(text, @"(?i)(?<=^id2\s*?:\s*?)\w*?(?=\s*?$)", "NewValue2",
RegexOptions.Multiline);
File.WriteAllText("outputfile.txt", text);
正規表現では、(?i)(?<= ^ id2 \ s *?:\ s *?)\ w *?(?= \ s *?$)は、任意の数のスペースでid2で始まるものを検索することを意味しますの前後で:
、次の文字列(句読点を除く任意の英数字)を'行の終わりまで置き換えます。句読点を含める場合は、\ w *?を置き換えます。と。*?
このようなものがうまくいくはずです。これは非常に単純で、最も効率的な方法ではありませんが、小さなファイルの場合は問題ありません。
private void setValue(string filePath, string key, string value)
{
string[] lines= File.ReadAllLines(filePath);
for(int x = 0; x < lines.Length; x++)
{
string[] fields = lines[x].Split(':');
if (fields[0].TrimEnd() == key)
{
lines[x] = fields[0] + ':' + value;
File.WriteAllLines(lines);
break;
}
}
}
これを実現するために正規表現を使用できます。
Regex re = new Regex(@"^ID\d+ :Value(\d+)\s*$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
List<string> lines = File.ReadAllLines("mytextfile");
foreach (string line in lines) {
string replaced = re.Replace(target, processMatch);
//Now do what you going to do with the value
}
string processMatch(Match m)
{
var number = m.Groups[1];
return String.Format("ID{0} :NewValue{0}", number);
}