Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取EDI文件并写入新文件_C#_Linq_Comparison_Filestream - Fatal编程技术网

C# 读取EDI文件并写入新文件

C# 读取EDI文件并写入新文件,c#,linq,comparison,filestream,C#,Linq,Comparison,Filestream,我有一个大的文本文件(大约有20k行),使用它我需要替换其他文本文件中的一些文本行(大约60-70行)。 其他文件可以称为模板。根据某些条件,需要替换这些模板中的行 文件的示例内容: ISA*00* *00* *01*000123456 *ZZ*PARTNERID~ *090827*0936*U*00401*000000055*0*T*>~ GS*PO*000123456*PARTNERID*20090827*1041*

我有一个大的文本文件(大约有20k行),使用它我需要替换其他文本文件中的一些文本行(大约60-70行)。 其他文件可以称为模板。根据某些条件,需要替换这些模板中的行 文件的示例内容:

ISA*00*          *00*          *01*000123456      *ZZ*PARTNERID~       *090827*0936*U*00401*000000055*0*T*>~      
GS*PO*000123456*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);
然后我需要逐个循环遍历文件夹中的模板文件。一旦我选择了一个模板文件,我将加载到另一个文件流中(模板最多有300行)

在阅读文件时,我将不得不多次回到前面的几行。但是如果我使用
ReadToEnd()
ReadLine()
方法读取文件,则无法返回到前几行。 为了克服这个问题,我将模板读入行集合中。但是将内容文件读入一个集合是一个好主意,因为它非常庞大。该文件将涉及大量搜索。缓冲流在这里有用吗

还是有更好的方法


谢谢

在我看来,你几乎陷入了第二十二条军规的境地。要么将大文件加载到内存中(通过集合),这取决于服务器上的平均大小和可用内存,可能是最好的方法,要么另一种方法是迭代模板文件,每次迭代都加载一个新文件流打开大文件(因为文件I/O慢,但内存消耗低),这样你就可以执行“搜索”了,因为我们都知道文件流只是向前的。

20K行。多少钱?20兆欧?对我来说似乎是可管理的。如果你幸运的话,你的内容文件是纯ASCII或Unicode,我会考虑使用内存MyFrdFrfile()。将其映射到内存中。为什么它是纯ASCII或Unicode很重要?因为在UTF-8中,某些字符在物理上由多个字符表示,并且使用MemoryMappedFile,您必须手动对其进行解码,这非常重要,原因有二。