C#读取和写入同一个文件
我正在经历一个循环,每次运行我都希望打开一个txt/csv文件并搜索循环中指定的值。如果该值存在于txt文件中,我希望在该行中写入该值 这能做到吗?我一直在玩StreamReader和StreamWriter,但从未真正成功地读写同一个文件 我一开始试过这个,但是很明显StreamReader使文件“繁忙”,因此StreamWriter无法访问它C#读取和写入同一个文件,c#,file,C#,File,我正在经历一个循环,每次运行我都希望打开一个txt/csv文件并搜索循环中指定的值。如果该值存在于txt文件中,我希望在该行中写入该值 这能做到吗?我一直在玩StreamReader和StreamWriter,但从未真正成功地读写同一个文件 我一开始试过这个,但是很明显StreamReader使文件“繁忙”,因此StreamWriter无法访问它 private void WriteTempTXT() { StreamReader sr = new StreamReader(@tmpf
private void WriteTempTXT()
{
StreamReader sr = new StreamReader(@tmpfile);
StreamWriter sw = new StreamWriter(@tmpfile);
}
有什么方法可以做到这一点吗?首先,您需要跟进这一点 然后使用这个类
string path = Server.MapPath("Twitter Overview Report1.csv");
using (CsvFileReader reader = new CsvFileReader(path))
{
CsvRow row = new CsvRow();
while (reader.ReadRow(row))
{
foreach (string s in row)
{
string s_row = row[0].ToString();
s_row.Replace("mahmoude", "Ghandour");
}
Console.WriteLine();
}
}
using (CsvFileWriter writer = new CsvFileWriter(path))
{
}
写入CSV文件中的行时存在两个问题:
通常的方法是读取整个文件并将其解析为记录,更改记录,然后将整个文件写回。首先,可以这样做。您可以创建具有读/写访问权限的
文件流
,然后直接写入流。以下是概念证明:
using (var v = new StreamWriter(File.Create("a.txt"))) {
v.WriteLine("1234A67890");
}
FileStream fs = new FileStream("a.txt", FileMode.Open, FileAccess.ReadWrite);
while (fs.ReadByte() != 'A') {} // Dangerous. Loops until 'A' found, infinite loop if none.
fs.Position--;
fs.WriteByte((byte)'5');
fs.Close(); // contents of a.txt now 1234567890
然而,这种方法存在一些基本问题:
StreamReader
/StreamWriter
。两者都将数据存储在内部缓冲区中,如果同时写入和读取底层流,则内部缓冲区可能会失效。您可以调用,但MSDN指出“此方法会降低性能,只有在绝对必要时才应调用。”相反,除非压倒性的考虑(例如,文件相对于可用的存储空间是巨大的),您可能需要考虑这种方法:
System.IO.Path.GetTempFileName()
)StreamReader
读取旧文件,使用StreamWriter
写入新文件。)这种方法在概念上是相似的,但不会产生同时读取和写入同一流的风险和复杂性。它的可能重复并不能完全满足我的需要。正如我所说的,我只是不想在它的末尾添加数据,而是更新行。请参阅此[链接][1]。这应该可以帮助你[1]:文件有多大?从整体上看,逐行处理,然后写入更改是最明显、最快和最消耗内存的方式。这样做15000次,我们在这里讨论的性能方面是什么?我不同意(2),在处理csv文件时,您可以安全地使用
ReadLine()
。但不确定不同的编码。@Sinatr:你错了。例如,如果您尝试读取记录1,2,“Hello\r\nworld”
,则ReadLine
方法将为您提供部分记录1,2,“您好
@user3218338:读取和写入15000个文件自然需要很长时间。如果你一遍又一遍地修改同一个文件,那么你应该自然地读一次,做所有的修改,然后在处理完后再写回去。@Guffa,哦,没有想到换行符是内容的一部分(而且似乎在正确读写方面有问题)。那么是的,你是对的。我将字符串中的换行符替换为。替换(“\xd\xa”,“\\n”)
,然后返回。替换(“\\n”,“\xd\xa”)
。