2

我有一个特定格式的文本文件。首先是一个标识符,后跟三个空格和一个冒号。然后是这个标识符的值。

ID1   :Value1  
ID2   :Value2  
ID3   :Value3

我需要做的是搜索例如ID2 :Value2用新值替换NewValue2。有什么方法可以做到这一点?我需要解析的文件不会变得很大。最大的将是大约 150 行。

4

6 回答 6

4

如果文件不是那么大,您可以执行 aFile.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 回答
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 回答
1

通常,对于任何文本搜索和替换,我建议使用某种正则表达式工作,但如果这就是你所做的一切,那真的是矫枉过正。

我只会打开原始文件和一个临时文件;一次读一行,然后检查每一行是否有“ID2:”;如果找到它,请将替换字符串写入临时文件,否则,只需写入您阅读的内容。当您用完源时,关闭两者,删除原始文件,并将临时文件重命名为原始文件。

于 2012-08-09T13:23:35.563 回答
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 回答
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开头且带有任意数量空格的任何内容before 和 after :,并一直替换以下字符串(任何字母数字字符,不包括标点符号)直到行尾。如果要包含标点符号,请替换\w*? .*?

于 2012-08-09T14:14:44.053 回答
-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 回答