C# 文本文件,每行代表一个用户,我可以更新一行吗?

C# 文本文件,每行代表一个用户,我可以更新一行吗?,c#,asp.net,file-io,C#,Asp.net,File Io,如果我有一个文本文件,如: 123, joe blow, USA 其中,第一个值表示: 用户ID、名称、国家/地区 如果我的文件有5000行,我是否可以使用C#?以某种方式更新特定行您有两个选项 使用流,找到行的索引并插入一些字符 将整个文件加载到数组中,修改它并重新写入整个文件 使用选项1,您的代码将更加复杂,但即使您的文件增加到500000000行,它也可以扩展到工作状态 对于选项2,代码非常简单,但是由于您将整个内容加载到内存中,因此对于大型数据集来说,它不是非常有效 对于选项2,这样的

如果我有一个文本文件,如:

123, joe blow, USA
其中,第一个值表示:

用户ID、名称、国家/地区

如果我的文件有5000行,我是否可以使用C#?

以某种方式更新特定行您有两个选项

  • 使用流,找到行的索引并插入一些字符
  • 将整个文件加载到数组中,修改它并重新写入整个文件
  • 使用选项1,您的代码将更加复杂,但即使您的文件增加到500000000行,它也可以扩展到工作状态

    对于选项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方法可能是您编写的,以查看您想要更新的行。

    您有两个选项

  • 使用流,找到行的索引并插入一些字符
  • 将整个文件加载到数组中,修改它并重新写入整个文件
  • 使用选项1,您的代码将更加复杂,但即使您的文件增加到500000000行,它也可以扩展到工作状态

    对于选项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方法可能是您编写以查看您想要更新的行的方法。

    虽然可以更改文件中的一行,但只有在替换文本的长度完全相同的情况下才能安全地执行此操作。因为这种情况很少发生,所以最好的办法是用新结果替换文件的全部内容

    基于行的文本文件不是一种很好的格式来存储可能正是由于这个原因而更改的信息

    现在,假设文件不太大,可以将其全部加载到字符串数组中,替换特定行的文本,然后将文件写回:

    using System.IO;
    
    var linesOfText File.ReadLines( "/myfile.txt", Text.Encoding.UTF8 ).ToArray();
    
    linesOfText[123] = "456, sally smith, USA";
    
    File.WriteAllLines( "/myfile.txt", linesOfText );
    
    编辑:为了简洁起见,我在上面提供了一个使用索引位置更新特定行的示例。在任何实际使用中,都应该解析行并搜索要更新/替换的行,而不是依赖偏移量


    如果文件太大,我不会使用上面的代码,因为大约5000行50个字符相对较小(<1Mb),所以我不会担心。但是,如果要反复执行这种类型的操作,可能需要重新考虑如何存储这些数据。

    虽然可以更改文件中的一行,但只有在替换文本的长度完全相同的情况下才能安全地执行此操作。因为这种情况很少发生,所以最好的办法是用新结果替换文件的全部内容

    基于行的文本文件不是一种很好的格式来存储可能正是由于这个原因而更改的信息

    现在,假设文件不太大,可以将其全部加载到字符串数组中,替换特定行的文本,然后将文件写回:

    using System.IO;
    
    var linesOfText File.ReadLines( "/myfile.txt", Text.Encoding.UTF8 ).ToArray();
    
    linesOfText[123] = "456, sally smith, USA";
    
    File.WriteAllLines( "/myfile.txt", linesOfText );
    
    编辑:为了简洁起见,我在上面提供了一个使用索引位置更新特定行的示例。在任何实际使用中,都应该解析行并搜索要更新/替换的行,而不是依赖偏移量


    如果文件太大,我不会使用上面的代码,因为大约5000行50个字符相对较小(<1Mb),所以我不会担心。但是,如果要反复执行这种类型的操作,您可能需要重新考虑如何存储这些数据。

    您必须读取整个文件,更新行,然后再次写入该文件


    但是,您可以一次读取一行文件,将每一行写入一个新文件(根据需要修改所需的行)。然后删除(或重命名)原始文件并重命名新文件。

    您必须读取整个文件,更新行,然后再次写入文件


    但是,您可以一次读取一行文件,将每一行写入一个新文件(根据需要修改所需的行)。然后删除(或重命名)原始文件并重命名新文件。

    +1 for>基于行的文本文件不是一种很好的格式,用于存储可能正是因为这个原因而更改的信息。正确,但可能值得指出的是,您假设用户ID是连续的,并且没有一个被删除。通常情况下是顺序的,但是如果删除了任何一个,那么您的示例是错误的。在更改行之前,需要进行某种形式的实际搜索。+1 for>基于行的文本文件对于存储可能正是因为这个原因而更改的信息不是一种很好的格式。这是正确的,但可能值得指出的是,您假设用户ID是连续的,并且没有被删除。通常情况下是顺序的,但是如果删除了任何一个,那么您的示例是错误的。在更改之前,需要进行某种实际的搜索以找到正确的行。