2

特定の形式のテキスト ファイルがあります。最初に識別子が続き、その後に 3 つのスペースとコロンが続きます。次に、この識別子の値が続きます。

ID1   :Value1  
ID2   :Value2  
ID3   :Value3

私がする必要があるのは、たとえば検索して新しい値ID2 :に置き換えることです。これを行う方法は何ですか?解析する必要があるファイルはそれほど大きくなりません。最大で約 150 行になります。Value2NewValue2

4

6 に答える 6

4

これは、ソースファイルのバックアップも自動的に作成する簡単なソリューションです。

置換は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

于 2012-08-09T13:37:27.797 に答える
4

ファイルがそれほど大きくない場合は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);
}
于 2012-08-09T13:22:43.427 に答える
1

通常、テキストの検索と置換では、ある種の正規表現を使用することをお勧めしますが、これだけを行っている場合、それは本当にやり過ぎです。

元のファイルと一時ファイルを開くだけです。オリジナルを一度に 1 行ずつ読み、各行で "ID2 :" をチェックします。見つかった場合は、置換文字列を一時ファイルに書き込みます。そうでない場合は、読み取ったものを書き込みます。ソースがなくなったら、両方を閉じて、元のファイルを削除し、一時ファイルの名前を元の名前に変更します。

于 2012-08-09T13:23:35.563 に答える
0

正規表現を使用して、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 *?を置き換えます。。*?

于 2012-08-09T14:14:44.053 に答える
0

このようなものがうまくいくはずです。これは非常に単純で、最も効率的な方法ではありませんが、小さなファイルの場合は問題ありません。

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;
        }
    }
}
于 2012-08-09T13:29:39.920 に答える
-1

これを実現するために正規表現を使用できます。

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);
}
于 2012-08-09T13:24:52.067 に答える