2011-08-10 44 views
0

我有一個很大的文本文件(它有大約20k行),我需要用其替換其他文本文件中的一些文本行(大約60-70行)。 其他文件可以被稱爲模板。在這些模板的行需要換下根據一些條件來 示例內容的文件:閱讀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如下,並使用流閱讀器閱讀。

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

然後我需要循環瀏覽一個文件夾中的模板文件。一旦我選擇一個模板文件,我將加載到另一個FileStream(max模板中將有300行)。

在閱讀文件時,我將不得不回到前幾行。但是,如果我使用ReadToEnd()ReadLine()讀取文件,將不可能返回到前面的行。 爲了克服這個問題,我正在將模板讀入線條集合中。但將內容文件讀入集合是一個好主意,因爲它非常龐大。這個文件中會涉及很多搜索。這裏有什麼用途的緩衝流嗎?

或者有沒有更好的方法呢?

感謝

+0

20k行?那個多少錢? 20 Meg?對我來說這似乎易於管理。如果你很幸運,你的內容文件是純ASCII或Unicode,我會考慮使用MemoryMappedFile(http://msdn.microsoft.com/en-us/library/dd267535.aspx)將其映射到內存中。爲什麼重要的是它是純粹的ASCII或Unicode?因爲在UTF-8中某些字符在物理上由多個字符表示,並且使用MemoryMappedFile,您將不得不手動對其進行解碼,這是非常重要的,原因有兩個。 – FuleSnabel

回答

2

在我看來,你在一個catch-22的情況是差不多。它要麼將大文件加載到內存中(通過集合),這取決於服務器上可用的平均大小和內存,可能是最好的方法,或者另一種方法是遍歷模板文件,並且對於每次迭代,加載一個新的文件流,每次打開大文件(由於文件I/O較慢,但內存消耗較低),因此您可以執行「搜索」,因爲我們都知道文件流只是前向的。