gpt4 book ai didi

c# - 使用 streamReader.ReadBlock(缓冲区)导入文件

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:54 25 4
gpt4 key购买 nike

需要导入大量文本文件并查找一些研究资料,特别是针对我的问题,我决定在这里发布解决方案。我相信它会对其他人有所帮助。

我的文件是 3,000,000 的注册表。尝试使用 StreamReader.ReadLine() 逐行读取,但这不切实际。此外,文件太大,无法将它们加载到内存中。

解决方案是使用 streamReader.ReadBlock() 将文件加载到内存中的 block (缓冲区)中。

我遇到的困难是 ReadBlock() 逐字节读取,连续发生或获得另一半。然后下一个缓冲区的第一行是不完整的。为了更正,我加载了一个 string (resto) 并与下一个缓冲区的第一行 (primeiraLinha) 连接。

使用 Split 的另一个重要细节,在大多数示例中,变量的第一次验证之后是 Trim() 以消除空格。在这种情况下我不使用,因为它加入了第 1 行和第 2 行缓冲区。

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
class Program
{
static void Main()
{
const string arquivo = "Arquivo1.txt";
using (var streamReader = new StreamReader(arquivo))
{
int deslocamento = 1000;
int pStart = 0; // buffer starting position
int pEnd = deslocamento; // buffer end position
string resto = "";
for (int i = pStart; i < int.MaxValue; i += pStart)
{
string primeiraLinha;
char[] buffer = new char[pEnd-pStart];
streamReader.ReadBlock(buffer, 0, buffer.Length);
var bufferString = new String(buffer);
string[] bufferSplit = null;
bufferSplit = bufferString.Split(new char[] { '\n' });
foreach (var bs in bufferSplit )
{
if (bs != "")
{
if (resto != "")
{
primeiraLinha = resto + bs;
Console.WriteLine(primeiraLinha);
resto = "";
}
else
{
if (bs.Contains('\r'))
{
Console.WriteLine(bs);
}
else
{
resto = bs;
}
}
}
}
Console.ReadLine();
// Moves pointers
pStart = pEnd;
pEnd += deslocamento;
if (bufferString == null)
break;
}
}
}
}
}

我的 friend 培训 Gabriel Gustaf 给我很大的帮助,解决了这个问题。

如果有人有任何进一步改进性能的建议,或提出任何意见,请随时提出。

最佳答案

C# 有一个设计类来处理大文件:MemoryMappedFile .这很简单,我认为可以帮助你。

关于c# - 使用 streamReader.ReadBlock(缓冲区)导入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041220/

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