【问题标题】:Using StreamReader and StreamWriter to Modify Files使用 StreamReader 和 StreamWriter 修改文件
【发布时间】:2012-02-22 12:32:47
【问题描述】:

我正在尝试使用 StreamReader 和 StreamWriter 打开一个文本文件(固定宽度)并修改一些特定的数据列。我有以下格式的日期,这些日期将被转换为压缩的 COMP-3 字段。

020100718F
020100716F
020100717F
020100718F
020100719F

我希望能够使用 StreamReader 从文件中读取日期,然后将它们转换为打包字段(5 个字符),然后使用 StreamWriter 输出它们。但是,我还没有找到一种方法来使用 StreamWriter 到一个特定的位置,并开始怀疑是否可能。

我有以下代码snip-it。

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 帖子了解更多信息:Here

这是压缩在 COMP-3 中的以下日期“20120123”的图片。这是我的最终结果,我将其包括在内,因为我不确定它是否会影响可能的答案。

我的问题是如何让 StreamWriter 动态替换文件中的数据并更改行的长度?

【问题讨论】:

  • 我似乎无法找到您的实际问题。如果您解释什么是压缩的 COMP-3 数据字段,可能会有所帮助。如果您告诉我们预期的结果,也可能会有所帮助。
  • 请不要在标题前加上“C#”之类的前缀。这就是标签的用途。
  • 经过 BCD 编码后,您将获得 二进制 数据。不要使用 StreamWriter 将其写入文件,而是使用 FileStream。

标签: c# file-io ssis streamreader streamwriter


【解决方案1】:

我一直发现读取输入文件、过滤/处理数据并将输出写入临时文件会更好。完成后,删除原始文件(或进行备份)并将临时文件复制过来。这样一来,您就不会丢失一半的输入文件,以防在处理过程中出现问题。

【讨论】:

    【解决方案2】:

    您可能应该直接使用 Stream(可能是 FileStream)。这将允许你改变位置。

    但是,您不能以这种方式更改记录大小,至少不能内联。您可以让一个 Stream 从原始文件中读取,而另一个 Stream 写入到文件的新转换副本。

    【讨论】:

      【解决方案3】:

      但是,我还没有找到一种方法来使用 StreamWriter 到特定位置,并且 开始怀疑是否可能。

      你可以使用StreamWriter.BaseStream.Seek方法

      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");                
      }
      

      【讨论】:

      • 这可能是有问题的,具体取决于编码。您必须小心不要定位到多字节字符的中间。
      • -1 还有其他问题,例如Flush。试试这个:StreamWriter wr = new StreamWriter(File.Create(@"c:\temp\aaa.txt")); wr.Write("ABC"); wr.BaseStream.Seek(0, SeekOrigin.Begin); wr.Write("Z"); wr.Close(); 输出不会是 ZBC
      猜你喜欢
      • 2013-12-17
      • 2015-10-27
      • 2019-02-26
      • 1970-01-01
      • 2013-05-15
      • 2013-01-05
      • 2019-06-11
      • 2015-04-15
      • 2016-08-23
      相关资源
      最近更新 更多