gpt4 book ai didi

c# - 在 C# 中读取和写入非常大的文本文件

转载 作者:太空狗 更新时间:2023-10-29 22:30:10 25 4
gpt4 key购买 nike

我有一个非常大的文件,大小将近 2GB。我正在尝试编写一个进程来读取文件并在没有第一行的情况下将其写出。我几乎一次只能读和写一行,这需要很长时间。我可以打开它,删除第一行并在 TextPad 中更快地保存它,尽管这仍然很慢。

我使用此代码获取文件中的记录数:

private long getNumRows(string strFileName)
{
long lngNumRows = 0;
string strMsg;

try
{
lngNumRows = 0;
using (var strReader = File.OpenText(@strFileName))
{
while (strReader.ReadLine() != null)
{
lngNumRows++;
}

strReader.Close();
strReader.Dispose();
}
}
catch (Exception excExcept)
{
strMsg = "The File could not be read: ";
strMsg += excExcept.Message;
System.Windows.MessageBox.Show(strMsg);
//Console.WriteLine("Thee was an error reading the file: ");
//Console.WriteLine(excExcept.Message);

//Console.ReadLine();
}

return lngNumRows;
}

这只需要几秒钟就可以运行。当我添加以下代码时,它需要永远运行。难道我做错了什么?为什么写入会增加这么多时间?关于如何使它更快的任何想法?

private void ProcessTextFiles(string strFileName)
{
string strDataLine;
string strFullOutputFileName;
string strSubFileName;
int intPos;
long lngTotalRows = 0;
long lngCurrNumRows = 0;
long lngModNumber = 0;
double dblProgress = 0;
double dblProgressPct = 0;
string strPrgFileName = "";
string strOutName = "";
string strMsg;
long lngFileNumRows;

try
{
using (StreamReader srStreamRdr = new StreamReader(strFileName))
{
while ((strDataLine = srStreamRdr.ReadLine()) != null)
{
lngCurrNumRows++;

if (lngCurrNumRows > 1)
{
WriteDataRow(strDataLine, strFullOutputFileName);
}
}

srStreamRdr.Dispose();
}
}
catch (Exception excExcept)
{
strMsg = "The File could not be read: ";
strMsg += excExcept.Message;
System.Windows.MessageBox.Show(strMsg);
//Console.WriteLine("The File could not be read:");
//Console.WriteLine(excExcept.Message);
}
}

public void WriteDataRow(string strDataRow, string strFullFileName)
{
//using (StreamWriter file = new StreamWriter(@strFullFileName, true, Encoding.GetEncoding("iso-8859-1")))
using (StreamWriter file = new StreamWriter(@strFullFileName, true, System.Text.Encoding.UTF8))
{
file.WriteLine(strDataRow);
file.Close();
}
}

最佳答案

不确定这会在多大程度上提高性能,但可以肯定的是,为要写入的每一行打开和关闭输出文件并不是一个好主意。

而是只打开这两个文件一次,然后直接写入该行

using (StreamWriter file = new StreamWriter(@strFullFileName, true, System.Text.Encoding.UTF8))
using (StreamReader srStreamRdr = new StreamReader(strFileName))
{
while ((strDataLine = srStreamRdr.ReadLine()) != null)
{
lngCurrNumRows++;

if (lngCurrNumRows > 1)
file.WriteLine(strDataRow);
}
}

您还可以删除对 lngCurrNumRow 的检查,只需在进入 while 循环之前进行空读取即可

strDataLine = srStreamRdr.ReadLine();
if(strDataLine != null)
{
while ((strDataLine = srStreamRdr.ReadLine()) != null)
{
file.WriteLine(strDataRow);
}
}

关于c# - 在 C# 中读取和写入非常大的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com