每行的文本文件代表一个用户,我可以更新一个特定的行吗?

时间:2010-05-14 19:52:57

标签: c# asp.net file-io

如果我有一个文本文件:

123, joe blow, USA

第一个值代表:

USERID,NAME,COUNTRY

如果我的文件有5000行,我可以使用C#以某种方式更新特定行吗?

3 个答案:

答案 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. 使用Stream并查找行的索引并插入一些字符
  2. 将整个文件加载到数组中,修改它并重写整个文件。
  3. 使用选项编号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方法可能是您编写的内容,以查看您需要更新的行。