2012-01-30 93 views
4

我想使用StreamReader和StreamWriter打開一個文本文件(固定寬度)並修改一些特定的數據列。我有以下格式的日期將被轉換爲打包的COMP-3字段。使用StreamReader和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: 
[email protected]#$%0718F 
020100716F 
020100717F 
020100718F 
020100719F 

[email protected]#$% = Ascii Characters SO can't display 

任何想法?謝謝!

UPDATE 上盒裝字段COMP-3

盒裝字段中的信息被用於由COBOL系統,以減少一個字段要求在文件的字節數。請參閱以下SO帖子瞭解更多信息:Here

以下是COMP-3包裝的以下日期「20120123」的圖片。這是我的最終結果,因爲我不確定這是否會影響可能的答案。

Picture of the following date 2012packed

我的問題是你如何獲得的StreamWriter動態替換數據的文件中並更改行的長度?

+0

我似乎無法找到您的實際問題。如果你解釋打包的COMP-3數據字段是什麼,它可能會有所幫助。如果您告訴我們預期的結果,可能也會有所幫助。 – 2012-01-30 18:12:40

+0

請不要用「C#」等來標題。這就是標籤的用途。 – 2012-01-30 18:15:26

+0

經過BCD編碼後,您將獲得**二進制**數據。不要使用StreamWriter將其寫入文件,而是使用FileStream。 – 2012-01-30 21:54:58

回答

2

我一直覺得它更好地讀取輸入文件,過濾器/過程中的數據,並輸出寫入到一個臨時文件。完成後,刪除原始文件(或進行備份)並複製臨時文件。這樣,如果在處理過程中出現問題,您還沒有損失一半的輸入文件。

0

但是,我還沒有找到一種方法來使用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");     
} 
+3

取決於編碼,這可能會有問題。您必須小心,不要放置在多字節字符的中間。 – 2012-01-30 18:23:34

+1

-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 – 2012-01-30 22:38:05

+0

@ L.B謝謝指出。編輯答案。 – 2012-01-31 20:33:24

1

您應該直接使用流(可能是FileStream)。這將允許你改變位置。

但是,您不能以這種方式更改記錄大小,至少不能在線。您可以從原始文件讀取一個Stream,然後再寫入一個新的轉換後的文件副本。