C# 使用StreamReader和StreamWriter修改文件
我试图使用StreamReader和StreamWriter打开一个文本文件(固定宽度)并修改一些特定的数据列。我有以下格式的日期将被转换为压缩的COMP-3字段C# 使用StreamReader和StreamWriter修改文件,c#,file-io,ssis,streamreader,streamwriter,C#,File Io,Ssis,Streamreader,Streamwriter,我试图使用StreamReader和StreamWriter打开一个文本文件(固定宽度)并修改一些特定的数据列。我有以下格式的日期将被转换为压缩的COMP-3字段 020100718F 020100716F 020100717F 020100718F 020100719F 我希望能够使用StreamReader读取文件中的日期,然后将其转换为压缩字段(5个字符),然后使用StreamWriter输出。然而,我还没有找到一种方法来使用StreamWriter来调整到一个特定的位置,我开始怀疑这是
020100718F
020100716F
020100717F
020100718F
020100719F
我希望能够使用StreamReader读取文件中的日期,然后将其转换为压缩字段(5个字符),然后使用StreamWriter输出。然而,我还没有找到一种方法来使用StreamWriter来调整到一个特定的位置,我开始怀疑这是否可行
我有以下代码剪掉它
System.IO.StreamWriter writer;
this.fileName = @"C:\Test9.txt";
reader = new System.IO.StreamReader(System.IO.File.OpenRead(this.fileName));
currentLine = reader.ReadLine();
currentLine = currentLine.Substring(30, 10); //Substring Containing the Date
reader.Close();
...
// Convert currentLine to Packed Field
...
writer = new System.IO.StreamWriter(System.IO.File.Open(this.fileName, System.IO.FileMode.Open));
writer.Write(currentLine);
目前我所拥有的功能如下:
After:
!@#$%0718F
020100716F
020100717F
020100718F
020100719F
!@#$% = Ascii Characters SO can't display
有什么想法吗?谢谢
更新
关于压缩字段COMP-3的信息
COBOL系统使用压缩字段来减少文件中字段所需的字节数。有关更多信息,请参阅以下SO帖子:
这是包装在COMP-3中的以下日期“20120123”的图片。这是我的最终结果,我之所以将其包括在内,是因为我不确定这是否会影响可能的答案
我的问题是如何让StreamWriter动态替换文件中的数据并更改行的长度
然而,我还没有找到一种方法来使用StreamWriter来定位特定的位置,并且
开始怀疑这是否可能
你可以使用这个方法
我总是发现读取输入文件、过滤/处理数据并将输出写入临时文件更好。完成后,删除原始文件(或进行备份)并复制临时文件。这样你就不会丢失一半的输入文件,以防在处理过程中出错。 你可能应该直接使用流(可能是
但是,您不能以这种方式更改记录大小,至少不能在线更改。您可以让一个流读取原始文件,另一个流写入文件的新转换副本。我似乎找不到您真正的问题是什么。如果您解释什么是压缩COMP-3数据字段,可能会有所帮助。如果您告诉我们预期的结果,可能也会有所帮助。请不要在标题前加上“C”之类的前缀。这就是标记的用途。BCD编码后,您将获得二进制数据。不要使用StreamWriter将其写入文件,而是使用FileStream。根据编码的不同,这可能会有问题。您必须小心不要定位到多字节字符的中间。-1还有其他问题,如
刷新。试试这个:StreamWriter wr=newstreamwriter(File.Create(@“c:\temp\aaa.txt”);wr.Write(“ABC”);wr.BaseStream.Seek(0,SeekOrigin.Begin);wr.写(“Z”);wr.Close()代码>输出不会是ZBC
using (StreamWriter wr = new StreamWriter(File.Create(@"c:\Temp\aaa.txt")))
{
wr.Write("ABC");
wr.Flush();
wr.BaseStream.Seek(0, SeekOrigin.Begin);
wr.Write("Z");
}