C# 替换文本文件中字符串的一部分
我想替换.txt文件字符串行的第二部分。我的.txt是: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) {
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;