【问题标题】:Replace a word from a specific line in a text file替换文本文件中特定行中的单词
【发布时间】:2014-05-20 12:22:48
【问题描述】:

我正在开发一个小测试程序来试验文本文件并在其中存储一些数据,并且在尝试替换特定行中的值时偶然发现了一个问题。

这就是我的文本文件的格式化方式:

user1, 1500, 1
user2, 1700, 17

..等等。

这是我目前用来逐行读取文件的代码:

string line;
Streamreader sr = new Streamreader(path);

while ((line = sr.ReadLine()) != null)
{
   string[] infos = line.Split(',');
   if (infos[0] == username) //the username is received as a parameter (not shown)
      //This is where I'd like to change the value
}

基本上,我的目标是仅在用户名匹配时更新点数(文本行中的第二个值 - infos[1])。我尝试使用以下代码(已编辑以匹配我的信息)

string text = File.ReadAllText("test.txt");
text = text.Replace("some text", "new value");
File.WriteAllText("test.txt", text);</pre>

这样做的问题是它将替换文本文件中的每个对应值,而不仅仅是正确的行之一(由匹配的用户名指定)。我知道如何更改 infos[1] 的值(例如:user1 为 1500),但我不知道之后如何将其重写到文件中。

我已经在网上和 StackOverflow 上进行了搜索,但我找不到任何关于这个特定问题的东西,其中值只有在正确的行上才能被修改 - 而不是文本中的任何地方。

我没有关于如何做到这一点的想法,我非常感谢一些建议。

非常感谢您的帮助。

【问题讨论】:

  • 您可以使用ReadAllLines 获取字符串列表,按照您当前的操作遍历它们,然后将它们写回(string.JoinEnvironment.NewLine,然后只需WriteAllText )

标签: c# text replace


【解决方案1】:

使用ReadLinesLINQ

var line = File.ReadLines("path")
               .FirstOrDefault(x => x.StartsWith(username));

if (line != null)
{
     var parts = line.Split(',');
     parts[1] = "1500"; // new number
     line = string.Join(",", parts);
     File.WriteAllLines("path", File.ReadLines("path")
         .Where(x => !x.StartsWith(username)).Concat(new[] {line});
}

【讨论】:

  • 谢谢,我试试这个。我想我必须用我要“验证”的字符串(用户名)替换“somevalue”,但是 {line} 呢,是我写我想要结束的字符串的地方吗?我必须写完整的字符串(例如:user1、1550、1)还是只写我想要更新的值(1550)?
  • 您可以编写所有行,或者首先您可以通过拆分更改特定部分并使用 Join 来获取完整行。我将更新我的答案以显示这一点。
【解决方案2】:

试试这个:

var path = @"c:\temp\test.txt";
var originalLines = File.ReadAllLines(path);

var updatedLines = new List<string>();
foreach (var line in originalLines)
{
    string[] infos = line.Split(',');
    if (infos[0] == "user2")
    {
        // update value
        infos[1] = (int.Parse(infos[1]) + 1).ToString();
    }

    updatedLines.Add(string.Join(",", infos));
}

File.WriteAllLines(path, updatedLines);

【讨论】:

  • 非常感谢 VinZ,这对我来说效果很好。非常感谢@Selman22 的回答,这里的代码对我有用,但我非常感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多