替换文本文件中的单词

时间:2014-04-06 20:27:56

标签: c# file text replace streamwriter

我正在做一个小程序,其中保存在某些用户上的数据存储在文本文件中。我正在使用Sytem.IOStreamwriter将新信息写入我的文本文件。

文件中的文字格式如下:

name1,1000,387
name2,2500,144

......等等。我正在使用infos = line.Split(',')将不同的值返回到一个对搜索更有用的数组中。我正在做的是使用While循环来搜索正确的行(名称匹配),并使用infos[1]返回点数。

我想修改此infos[1]值并将其设置为其他值。我正试图找到一种方法来替换C#中的单词,但我找不到一个好方法来做到这一点。从我所读到的,没有办法替换单个单词,你必须重写完整的文件。

有没有办法完全删除一行,以便我可以在文本文件的末尾重写它而不必担心它被复制?

我尝试使用Replace关键字,但它不起作用。通过查看针对类似问题提出的答案,我有点迷失,所以如果有人能解释我的选择,我会非常感激。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用File.ReadLines方法和LINQ来完成此任务。首先,获取您想要的行:

var line = File.ReadLines("path")
           .FirstOrDefault(x => x.StartsWith("name1 or whatever"));

if(line != null)
{
    /* change the line */
}

然后将新行写入您的文件,不包括旧行:

var lines = File.ReadLines("path")
                .Where(x => !x.StartsWith("name1 or whatever"));

var newLines = lines.Concat(new [] { line });

File.WriteAllLines("path", newLines);

答案 1 :(得分:0)

很可能你是C#的新手并且没有意识到字符串是不可变的(一种说法你不能改变它们的奇特方式)。您只能通过修改旧字符串来获取新字符串:

String MyString = "abc 123 xyz";

MyString.Replace("123", "999");  // does not work

MyString = MyString.Replace("123", "999");  // works

[编辑:]

如果我理解你的后续问题,你可以这样做:

infos[1] = infos[1].Replace("1000", "1500");

答案 2 :(得分:0)

您正在寻找的概念被称为随机访问'用于文件读/写。 C#中大多数易于使用的I / O方法都是“顺序访问”,这意味着你要读取一个块或一行并继续前进到下一个。

但是,您想要做的是,但您需要阅读有关文件流的一些教程。这是一个相关的SO问题。 .NET C# - Random access in text files - no easy way?

您可能正在阅读整个文件,或者在搜索过程中逐行阅读。如果字段是固定长度,则可以读取固定数量的字节,在读取时跟踪Stream.Position,知道要读取的字符数和需要替换的字符数,然后打开文件进行写入,移动到流中的确切位置,并写入新值。

如果你不熟悉溪流,那有点复杂。如果您的文件不是很大,如果编码正确,可以通过System.IO库非常有效地复制行的文件行,因此您可能只需按照第二个建议逐行读取文件,将其写入一个新的Stream(内存,临时文件,无论如何),当你到达那个值时替换有问题的行,完成后,替换原来的。