首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用streamReader.ReadBlock导入文件(缓冲区)

使用streamReader.ReadBlock导入文件(缓冲区)
EN

Stack Overflow用户
提问于 2013-04-16 15:37:05
回答 1查看 5K关注 0票数 2

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

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

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

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

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

代码语言:javascript
复制
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 )的大力帮助,解决了这个问题。

如果有人有任何建议,以进一步改善表现,或作出任何评论,请随时。

EN

回答 1

Stack Overflow用户

发布于 2013-04-16 15:56:54

C#有一个设计好的类来处理大文件:MemoryMappedFile。很简单我想可以帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16041220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档