我正在做一个小程序,其中保存在某些用户上的数据存储在文本文件中。我正在使用Sytem.IO
和Streamwriter
将新信息写入我的文本文件。
文件中的文字格式如下:
name1,1000,387
name2,2500,144
......等等。我正在使用infos = line.Split(',')
将不同的值返回到一个对搜索更有用的数组中。我正在做的是使用While
循环来搜索正确的行(名称匹配),并使用infos[1]
返回点数。
我想修改此infos[1]
值并将其设置为其他值。我正试图找到一种方法来替换C#中的单词,但我找不到一个好方法来做到这一点。从我所读到的,没有办法替换单个单词,你必须重写完整的文件。
有没有办法完全删除一行,以便我可以在文本文件的末尾重写它而不必担心它被复制?
我尝试使用Replace
关键字,但它不起作用。通过查看针对类似问题提出的答案,我有点迷失,所以如果有人能解释我的选择,我会非常感激。
答案 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(内存,临时文件,无论如何),当你到达那个值时替换有问题的行,完成后,替换原来的。