C# 替换文本文件中字符串的一部分

C# 替换文本文件中字符串的一部分,c#,C#,我想替换.txt文件字符串行的第二部分。我的.txt是: admin|admin ruiliberal|123456789 我想这样替换它,例如: admin|12345 ruiliberal|123456789 我的代码是: string dirConta = Environment.CurrentDirectory + "/Bd/contas.txt"; private void buttonGravaPass_Click(object sender, EventArgs e) {

我想替换.txt文件字符串行的第二部分。我的.txt是:

admin|admin
ruiliberal|123456789
我想这样替换它,例如:

admin|12345
ruiliberal|123456789
我的代码是:

string dirConta = Environment.CurrentDirectory + "/Bd/contas.txt";

private void buttonGravaPass_Click(object sender, EventArgs e)
{
    string[] lines = File.ReadLines(dirConta).ToArray();

    for (int i = 0; i < File.ReadAllLines(dirConta).Count(); i++)
    {

        string[] parts = lines[i].Split(new char[] { '|' });
        if (parts[0] == Users.user)
        {
            lines[i] = lines[i].Remove(lines[i].Length - 5);
            lines[i] = lines[i] + "12345";
        }
        File.WriteAllText(dirConta, lines[i]);
    }
}
string dirConta=Environment.CurrentDirectory+“/Bd/contas.txt”;
私有void按钮ravapass\u单击(对象发送者,事件参数e)
{
string[]lines=File.ReadLines(dirConta.ToArray();
对于(int i=0;i

这不起作用,它会删除最后一行。

所以我认为这段代码有一些地方不对劲

1.)您的for循环:

for(int i = 0; i < lines.Count(); i++)
{ [...] }
2.)分为以下几个部分: 因为您只有一个拆分字符,所以可以这样调用:

string[] parts = lines[i].Split('|');
3.)分配新字符串值: 为什么不这样做呢:

lines[i] = $"{parts[0]}|12345";
4.)我不建议每次循环都写入文件。只需放入
File.writealText(dirConta,第[i]行)在for循环之外

5.)如果您想存储数据,我强烈建议您研究对象序列化。它使很多事情变得更容易。
请参阅:

因此,在我看来,此代码存在一些错误

1.)您的for循环:

for(int i = 0; i < lines.Count(); i++)
{ [...] }
2.)分为以下几个部分: 因为您只有一个拆分字符,所以可以这样调用:

string[] parts = lines[i].Split('|');
3.)分配新字符串值: 为什么不这样做呢:

lines[i] = $"{parts[0]}|12345";
4.)我不建议每次循环都写入文件。只需放入
File.writealText(dirConta,第[i]行)在for循环之外

5.)如果您想存储数据,我强烈建议您研究对象序列化。它使很多事情变得更容易。
请参阅:

您的方法存在一些问题。首先,在连接字符串时应尽量避免
+
。使用
$”
string.Format
。其次,在进行事件编程时,最好编写事件方法调用的另一个方法,这样可以避免用不必要的工作(例如写入文件)阻塞UI线程。查看
System.IO
的文档,可以使用
File.ReadLines
对文本行进行迭代,因此我这样做了,而不是两次读取文件以获得行数。另外,不要使用
删除
+
,只需使用
替换
;这容易多了。最后,你需要确保你写下所有的文本。现在,你只写了第一行

string dirConta = $"{Environment.CurrentDirectory}/Bd/contas.txt";

private async Task ModifyFileAsync()
{
    var output = new List<string>();
    using (var reader = new StreamReader(dirConta))
    {
        while ((var line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
        {
            var parts = line.Split('|');
            if (parts[0] == Users.user)
            {
                var newLine = line.Replace(parts[1], "12345");
                lines.Add(newLine);
            }
            else
            {
                lines.Add(line);
            }
        }
    }

    using (var writer = new StreamWriter(dirConta))
    {
        foreach (var line in lines)
        {
            await writer.WriteLineAsync(line).ConfigureAwait(false);
        }
    }
}

private async void buttonGravaPass_Click(object sender, EventArgs e)
{
    await ModifyFileAsync().ConfigureAwait(false);
}
string dirConta=$“{Environment.CurrentDirectory}/Bd/contas.txt”;
专用异步任务ModifyFileAsync()
{
var输出=新列表();
使用(变量读取器=新的StreamReader(dirConta))
{
while((var line=await reader.ReadLineAsync().ConfigureAwait(false))!=null)
{
var parts=line.Split(“|”);
if(部件[0]==用户。用户)
{
变量换行=换行(零件[1],“12345”);
行。添加(换行符);
}
其他的
{
行。添加(行);
}
}
}
使用(var writer=newstreamwriter(dirConta))
{
foreach(行中的var行)
{
wait writer.WriteLineAsync(行).configurewait(false);
}
}
}
私有异步无效按钮ravapass\u单击(对象发送方,事件参数e)
{
等待ModifyFileAsync().ConfigureAwait(false);
}

您的方法存在一些问题。首先,在连接字符串时应尽量避免
+
。使用
$”
string.Format
。其次,在进行事件编程时,最好编写事件方法调用的另一个方法,这样可以避免用不必要的工作(例如写入文件)阻塞UI线程。查看
System.IO
的文档,可以使用
File.ReadLines
对文本行进行迭代,因此我这样做了,而不是两次读取文件以获得行数。另外,不要使用
删除
+
,只需使用
替换
;这容易多了。最后,你需要确保你写下所有的文本。现在,你只写了第一行

string dirConta = $"{Environment.CurrentDirectory}/Bd/contas.txt";

private async Task ModifyFileAsync()
{
    var output = new List<string>();
    using (var reader = new StreamReader(dirConta))
    {
        while ((var line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
        {
            var parts = line.Split('|');
            if (parts[0] == Users.user)
            {
                var newLine = line.Replace(parts[1], "12345");
                lines.Add(newLine);
            }
            else
            {
                lines.Add(line);
            }
        }
    }

    using (var writer = new StreamWriter(dirConta))
    {
        foreach (var line in lines)
        {
            await writer.WriteLineAsync(line).ConfigureAwait(false);
        }
    }
}

private async void buttonGravaPass_Click(object sender, EventArgs e)
{
    await ModifyFileAsync().ConfigureAwait(false);
}
string dirConta=$“{Environment.CurrentDirectory}/Bd/contas.txt”;
专用异步任务ModifyFileAsync()
{
var输出=新列表();
使用(变量读取器=新的StreamReader(dirConta))
{
while((var line=await reader.ReadLineAsync().ConfigureAwait(false))!=null)
{
var parts=line.Split(“|”);
if(部件[0]==用户。用户)
{
变量换行=换行(零件[1],“12345”);
行。添加(换行符);
}
其他的
{
行。添加(行);
}
}
}
使用(var writer=newstreamwriter(dirConta))
{
foreach(行中的var行)
{
wait writer.WriteLineAsync(行).configurewait(false);
}
}
}
私有异步无效按钮ravapass\u单击(对象发送方,事件参数e)
{
等待ModifyFileAsync().ConfigureAwait(false);
}

这是我的想法

using System;
using System.Collections.Generic;
using System.IO;

namespace Q_53401300
{
    class Program
    {

        static string dirConta = "C:\\temp2\\ListOfPWD.txt";

        static void Main(string[] args)
        {
            buttonGravaPass_Click(null, null);

        }

        private static void buttonGravaPass_Click(object sender, EventArgs e)
        {
            List<string> newLinesToWrite = new List<string>();
            using (System.IO.StreamReader sr = new StreamReader(dirConta))
            {
                string currentLine = string.Empty;
                while ((currentLine = sr.ReadLine()) != null)
                {
                    string[] parts = currentLine.Split(new char[] { '|' });
                    //if (parts[0] == Users.user)
                    //{
                    parts[0] = parts[0].Remove(parts[0].Length - 5);
                    parts[1] = parts[1] + "12345";
                    newLinesToWrite.Add($"{parts[0]}|{parts[1]}");
                    //}
                }
            }
            System.IO.File.WriteAllLines(dirConta, newLinesToWrite);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
名称空间Q_53401300
{
班级计划
{
静态字符串dirConta=“C:\\temp2\\listopfwd.txt”;
静态void Main(字符串[]参数)
{
按钮点击(空,空);
}
私有静态无效按钮ravapass\u单击(对象发送者,事件参数e)
{
List newLinesToWrite=newlist();
使用(System.IO.StreamReader sr=新StreamReader(dirConta))
{
字符串currentLine=string.Empty;