【问题标题】:Replace 1 line in text file Linq c#替换文本文件Linq c#中的1行
【发布时间】:2021-06-07 23:23:39
【问题描述】:

我的文本文件包含:

ABCD

QWERT

上午 8 点 20 分

78910

在第 3 行我想替换为:8:20 AM -> 9:25 AM

试试代码:

string[] file = File.ReadAllLines(filename);
file = file.Select((x, i) => i > 1 && i < 3 ? x.Replace("8:20 AM", "9:25 AM") : x).ToArray();
File.WriteAllLines(filename, file);

结果:

ABCD

QWERT

上午 8:20 上午 9:25

78910

可以帮我替换文本文件第 3 行中的所有文本。谢谢

【问题讨论】:

  • 如果您只是想更改整行,为什么要使用替换?只需返回“上午 9 点 25 分”即可。
  • 因为我没有找到其他解决方案。我只想在第 3 行更改时间。如果您知道请帮我解决它
  • ? "9:25 AM" : x
  • File.WriteAllText(filename,File.ReadAllText(filename).Replace("8:20 AM", "8:20 AM 9:25 AM"))
  • 然而,第 3 行中的时间总是在变化。有没有办法改变“8:20 Am”?

标签: c# linq text replace


【解决方案1】:

为什么使用数组,你可以使用列表来代替它会更容易。

 string[] file =  File.ReadAllLines(filename);
 var newList = string.Join(" ", file).Split('\n').Select(s => s.Replace("8:20 AM", "9:25 AM")).ToList();

            string output="";
            foreach(var item in newList)
            {
                output += item + "\n";
            }

File.WriteAllLines(filename, output);

试试这个。这可行,但是您必须确保从文本文件中获取的字符串始终由换行符或“\n”分隔;

【讨论】:

  • 然而,第 3 行中的时间总是在变化。有没有办法改变“8:20 Am”?
  • @Kevil 这是一个普遍错误的答案,所以请忽略它。
  • 约翰,我会在这里用你的代码解决问题。 1. File.ReadAllLines(filename) 会将文件的每一行读取为一个数组,这意味着所有的行都不应该包含任何\n\rn 字符。 2. 您将整个文件制作成一个长行,文件的每一原始行由空格字符分隔。 3. 用\n 分割这条长线会给你一个包含单个项目的字符串数组,因为没有\n 字符。 4. 然后您将该单项转换为单项列表。
  • 5.您正在从该单个项目构建字符串输出,这实际上是文件的整个原始内容,位于由空格分隔的单行上,时间被替换,以单个 \n 字符结尾。 6. 您正在使用WriteAllLines 并传递单个字符串,而不是字符串数组或IEnumerable&lt;string&gt;,这意味着该行将产生编译器错误,因为WriteAllLines 没有params string[] 签名。 7. 您的代码假定换行符是 \n(换行符),但在 Windows 上,换行符由 \r(回车)和 \n(换行符)组成:\r\n
  • 我将您的 File.WriteAllLines 固定为 File.WriteAllText 以便它可以编译,并且我创建了该文件的 before and after,并运行了您的代码。
【解决方案2】:

您的代码有两个问题:

  1. 您正在使用Replace,它在字符串x 中查找"8:20 AM",并将该值替换为"9:25 AM",返回一个新的字符串值。无论文件中该行当前是什么,您总是希望将相同的值写入文件。因此,您应该返回字符串文字 ("9:25 AM"),而不是 x 上的替换结果。
  2. 您的情况:i &gt; 1 &amp;&amp; i &lt; 3i 是一个 int(整数),意味着它只保存 整个 值。你为什么不直接检查i == 2呢?
string[] file = File.ReadAllLines(filename);
file = file.Select((x, i) => i == 2 ? "9:25 AM" : x).ToArray();
File.WriteAllLines(filename, file);

【讨论】:

  • 是的,这就是我想要的。感谢您的支持!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2017-06-06
相关资源
最近更新 更多