需要导入大量文本文件并查找一些研究资料,特别是针对我的问题,我决定在此处发布解决方案。我相信它会帮助别人。
我的文件是3,000,000的注册表。试图用 StreamReader.ReadLine()逐行阅读,但这是不切实际的。而且,文件太大而无法将它们加载到内存中。
解决方案是使用 streamReader.ReadBlock()在块(缓冲区)中加载内存中的文件。
我遇到的困难是 ReadBlock()逐字节读取,发生在一行或另外一半。然后第一行的下一个缓冲区不完整。为了更正,我加载字符串( resto )并与下一个缓冲区的第1行( primeiraLinha )连接。
使用 Split 的另一个重要细节,在大多数示例中,第一次验证变量后面是 Trim()以消除空格。在这种情况下,我不使用,因为它加入了第一行和第二行缓冲区。
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;
}
}
}
}
}
我的朋友训练Gabriel Gustaf帮助解决了这个问题。
如果有人有任何建议可以进一步改善表现,或发表任何评论,请随意。