【问题标题】:Search and replace values in text file with C#使用 C# 搜索和替换文本文件中的值
【发布时间】:2012-08-06 17:27:58
【问题描述】:

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

ID1   :Value1  
ID2   :Value2  
ID3   :Value3

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

【问题讨论】:

  • 你应该指定Value1,Value2的类型... Integer,string?

标签: c# search text replace


【解决方案1】:

如果文件不是那么大,您可以通过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);
}

【讨论】:

  • 唯一的问题是上面的数据不准确,并且每个新的“ID”值不在新行上。
  • 然后他可以去 File.ReadAllText 并解析一个大字符串,如果他说这是一个问题,我会举这个例子;另一方面..他确实说文件是 150 lines
  • 是的,每个ID肯定是换行。
  • 虽然所有变体似乎都回答了我的问题,但我选择了这个,因为它让我知道如何解决它:-)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以使用正则表达式来实现这一点。

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

    【讨论】:

      【解决方案4】:

      这样的事情应该可以工作。很简单,不是最有效率的东西,但是对于小文件来说,就好了:

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

      【讨论】:

        【解决方案5】:

        这是一个简单的解决方案,它还会自动创建源文件的备份。

        替换存储在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.txtoutput.txtinput.bak 替换为源文件、目标文件和备份文件的路径即可。

        【讨论】:

        • 问题是我不知道“Value2”的值。换句话说:我需要替换 "ID2 :" 后面的所有内容。
        【解决方案6】:

        您可以使用正则表达式并在 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 开头的任何内容,在 : 之前和之后有任意数量的空格,并将以下字符串(任何字母数字字符,不包括标点符号)一直替换到行尾。如果要包含标点符号,请将 \w*? 替换为 .*?

        【讨论】:

          猜你喜欢
          • 2016-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-13
          • 2016-10-18
          相关资源
          最近更新 更多