2013-04-16 4 views
2

많은 수의 텍스트 파일을 가져 와서 특히 내 문제의 연구 자료를 찾으려면 여기에 해결책을 게시하기로 결정했습니다. 나는 그것이 다른 누군가를 도울 것이라고 믿는다.streamReader.ReadBlock (버퍼)을 사용하여 파일 가져 오기

내 파일은 3,000,000 개까지 등록됩니다. StreamReader.ReadLine()을 사용하여 줄 단위로 읽으려고했지만 실용적이지 않습니다. 또한 파일이 너무 커서 메모리에로드 할 수 없습니다.

streamReader.ReadBlock()을 사용하여 파일을 메모리에로드하는 것이 해결책이었습니다.

내가 가진 어려움은 ReadBlock()이 행 단위로 읽거나 다른 절반을 읽는 바이트 단위로 읽는 것입니다. 다음 버퍼는 첫 번째 라인이 불완전합니다. 문제를 해결하려면 문자열 () (resto)을로드하고 다음 버퍼의 첫 번째 줄 (primeiraLinha)과 연결합니다.

공간을 제거하기 위해 변수 첫번째 검증 트림 (다음 대부분의 예에서 분할)를 사용하여 또 다른 중요한 세부. 이 경우에는 첫 번째 및 두 번째 라인 버퍼를 결합 했으므로 사용하지 않습니다.

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)의 도움을 많이 받았습니다.

성능을 향상 시키거나 의견을 나눌 제안이 있으시면 언제든지 알려주십시오.

+0

인코딩에주의하십시오. – SLaks

답변

0

C#은 대용량 파일 작업을위한 설계된 클래스가 있습니다 : MemoryMappedFile. 그것은 간단하고 당신을 도울 수 있다고 생각합니다.