2012-01-30 4 views
4

StreamReader 및 StreamWriter를 사용하여 텍스트 파일 (고정 폭)을 열고 데이터의 특정 열을 수정하려고합니다. 압축 된 COMP-3 필드로 변환 될 다음 형식의 날짜가 있습니다. 내가 날짜를 읽을 수 있어야합니다StreamReader 및 StreamWriter를 사용하여 파일 수정

020100718F 
020100716F 
020100717F 
020100718F 
020100719F 

가에서는 StreamReader를 사용하여 파일을 형성 한 후 포장 분야 (5 자), 그들을에서는 StreamWriter를 사용하여 다음 출력으로 변환. 그러나 StreamWriter를 사용하여 특정 위치로 이동하는 방법을 찾지 못했고 가능한 경우 궁금해하기 시작했습니다.

나는 다음과 같은 코드를 가지고있다.

After: 
[email protected]#$%0718F 
020100716F 
020100717F 
020100718F 
020100719F 

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

어떤 아이디어 :

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

현재 내가 가지고있는 것은 다음과 같은 작업을 수행? 감사! 포장 필드 COMP-3

포장 필드에

UPDATE 정보 필드가 파일에 필요 바이트의 수를 줄이기 위해 COBOL 시스템에 의해 사용됩니다. 자세한 내용은 다음 SO 게시물을 참조하십시오. Here

다음 그림은 COMP-3에 포장 된 다음 날짜 "20120123"입니다. 이것이 나의 최종 결과이며 가능한 답을 얻는 지 확실치 않아 포함 시켰습니다.

Picture of the following date 2012packed

내 질문은 StreamWriter를 동적으로 행의 길이를 파일 내부에 데이터를 교체하고 변경합니까 어떻게?

+0

실제 질문이 무엇인지 찾을 수 없습니다. 압축 된 COMP-3 데이터 필드가 무엇인지 설명하면 도움이됩니다. 예상되는 결과를 알려 주시면 도움이 될 수 있습니다. –

+0

제목 앞에 "C#"등을 붙이지 마십시오. 그것이 바로 태그입니다. –

+0

BCD 인코딩 후 ** 바이너리 ** 데이터를 얻을 수 있습니다. StreamWriter를 사용하여 파일에 쓰지 마십시오. 대신 FileStream을 사용하십시오. –

답변

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

인코딩에 따라 문제가 될 수 있습니다. 멀티 바이트 문자의 중간에 위치하지 않도록주의해야합니다. –

+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 –

+0

@ L.B가 아닐 것입니다. 수정 된 답변 –

1

스트림을 직접 사용해야합니다 (아마도 FileStream 일 것입니다). 이렇게하면 위치를 변경할 수 있습니다.

그러나 최소한 인라인이 아닌 방식으로 레코드 크기를 변경할 수는 없습니다. 원본 파일에서 하나의 스트림 읽기를, 파일의 새로운 변환 사본에 다른 스트림을 기록 할 수 있습니다.

관련 문제