2011-08-10 2 views
0

다른 텍스트 파일 (약 60-70 개)의 텍스트 행을 대체해야하는 큰 텍스트 파일 (약 20k 행)이 있습니다. 다른 파일을 템플릿으로 호출 할 수 있습니다. 이러한 템플릿의 선은 샘플 컨텐츠 파일의 일부 조건에 따라 한 바뀌 필요가있다 : 나는 아래와 같은 내용의 파일에서 파일 스트림을로드하고 스트림 리더를 사용하여 읽고있다EDI 파일 읽기 및 새 파일 쓰기

ISA*00*   *00*   *01*00*ZZ*PARTNERID~  *090827*0936*U*00401*000000055*0*T*>~  
GS*PO*00*PARTNERID*20090827*1041*2*X*004010~ 
ST*850*0003~ 
BEG*00*SA*1000012**20090827~ 
REF*SR*N~ 
CSH*Y~ 
TD5*****UPSG~ 
N1*ST*John Doe~ 
N3*126 Any St*~ 
N4*Hauppauge*NY*11788-1234*US~ 
PO1*1*1*EA*19.95**VN*0054321~ 
CTT*1*1~ 
SE*11*0003~ 
GE*1*2~ 
IEA*1*000000001~ 

.

FileStream baseFileStream= new FileStream("C:\\Content.txt", FileMode.Open); 

그런 다음 하나씩 폴더의 템플릿 파일을 반복해야합니다. 템플릿 파일을 선택하면 다른 FileStream에로드됩니다 (최대 300 개의 템플릿에 템플릿이 생깁니다).

파일을 읽는 동안 나는 여러 번 이전 줄로 돌아 가야 할 것입니다. 그러나 ReadToEnd() 또는 ReadLine() 메서드를 사용하여 이전 줄로 돌아가는 파일을 읽는 것은 불가능합니다. 이것을 극복하기 위해 템플릿을 라인 모음으로 읽습니다. 그러나 콘텐츠 파일을 매우 큰 것처럼 컬렉션으로 읽는 것이 좋습니다. 이 파일에 관련된 검색이 많이있을 것입니다. 버퍼링 된 스트림은 여기에서 사용할 수 있습니까?

아니면 더 좋은 방법이 있습니까?

감사합니다.

+0

20k 회선? 그건 얼마인가요? 20 메그? 나에게 그것은 관리할만한 것 같다. 운이 좋다면 콘텐츠 파일이 순수한 ASCII 또는 유니 코드 인 경우 MemoryMappedFile (http://msdn.microsoft.com/en-us/library/dd267535.aspx)을 사용하여 메모리에 매핑하는 것이 좋습니다. 순수 ASCII 또는 유니 코드 인 것이 중요한 이유는 무엇입니까? UTF-8에서 일부 문자는 물리적으로 여러 문자로 표시되기 때문에 MemoryMappedFile을 사용하면 수동으로 디코드해야합니다. 몇 가지 이유로 그다지 중요하지 않습니다. – FuleSnabel

답변

2

제 생각에는 거의 잡다한 상황입니다. 서버에서 사용할 수있는 평균 크기 및 메모리에 따라 가장 좋은 방법이 될 수있는 대용량 파일을 (컬렉션을 통해) 메모리에로드하거나 다른 방법으로 템플릿 파일을 반복하고 각 반복마다, 파일 I/O로 인해 느려지지만 메모리 소비가 적기 때문에 매번 큰 파일을 열어 새로운 파일 스트림을로드하십시오. 따라서 파일 스트림이 앞으로 만 전송된다는 것을 알기 때문에 "검색"을 수행 할 수 있습니다.