如果我有一个文本文件:
123, joe blow, USA
第一个值代表:
USERID,NAME,COUNTRY
如果我的文件有5000行,我可以使用C#以某种方式更新特定行吗?
答案 0 :(得分:4)
虽然可以改变文件中的一行 - 如果替换文本完全相同的长度,你只能安全地这样做。因为很少这种情况,您最好的办法是用新结果替换文件的全部内容。
基于行的文本文件不是一种很好的格式,用于存储可能因此而改变的信息。
现在,假设文件不是太大,您可以将其完整地加载到字符串数组中,替换特定行的文本,然后将文件写回:
using System.IO;
var linesOfText File.ReadLines( "/myfile.txt", Text.Encoding.UTF8 ).ToArray();
linesOfText[123] = "456, sally smith, USA";
File.WriteAllLines( "/myfile.txt", linesOfText );
编辑: 为了简洁起见,我提供了一个使用索引位置更新特定行的示例。在任何实际使用中,您应该解析这些行并搜索要更新/替换的行而不是依赖于偏移量。
如果文件过大,我不会使用上面的代码,大约5,000行的50个字符相对较小(<1Mb)所以,我不担心。但是如果你要反复进行这种类型的操作,你可能想重新考虑如何存储这些数据。
答案 1 :(得分:2)
您必须阅读整个文件,更新您的行,然后再次写入该文件。
但是,假设您可以一次读取文件一行,将每行写入新文件(根据需要修改所需的行)。然后删除(或重命名)原始文件并重命名新文件。
答案 2 :(得分:1)
您有两种选择。
使用选项编号1,您的代码将更复杂,但即使您的文件增长到500,000,000行,它也可以扩展。
使用选项编号2,代码非常简单,但由于您将整个内容加载到内存中,因此对于大型数据集而言并不是非常有效。
对于选项2,像这样的代码可能会让你开始:
var sbld = new System.Text.StringBuilder();
var rows = System.IO.File.ReadAllLines(@"C:\YourUserTextFile.txt");
foreach(var row in rows)
{
if(!updateThisRow(row))
{
var ar = row.Split(',');
var id = ar[0];
var name = ar[1];
var country = ar[2];
// do update here
sbld.AppendLine(String.Format("{0},{1},{2}", id, name, country));
}
else
{
sbld.AppendLine(row);
}
}
System.IO.File.WriteAllText(C:\YourUserTextFile.txt", sbld.ToString());
updateThisRow方法可能是您编写的内容,以查看您需要更新的行。