Использование StreamReader и StreamWriter для изменения файлов - PullRequest
4 голосов
/ 30 января 2012

Я пытаюсь использовать StreamReader и StreamWriter, чтобы открыть текстовый файл (фиксированная ширина) и изменить несколько определенных столбцов данных.У меня есть даты в следующем формате, которые будут преобразованы в упакованные поля COMP-3.

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 для получения дополнительной информации: Здесь

Вот изображение следующей даты "20120123", упакованной в COMP-3.Это мой конечный результат, и я включил его, потому что я не был уверен, повлияет ли он на возможные ответы.

Picture of the following date 20120123 packed

У меня вопрос: как заставить StreamWriter динамически заменять данные внутри?файл и изменить длину строк?

Ответы [ 3 ]

2 голосов
/ 30 января 2012

Мне всегда было удобнее читать входной файл, фильтровать / обрабатывать данные и записывать вывод во временный файл.После завершения удалите исходный файл (или сделайте резервную копию) и скопируйте временный файл.Таким образом, вы не потеряете половину входного файла на случай, если что-то пойдет не так в процессе обработки.

1 голос
/ 30 января 2012

Возможно, вы должны использовать Stream напрямую (вероятно, FileStream).Это позволит вам изменить положение.

Однако вы не сможете изменить размеры записи таким образом, по крайней мере, не в строке.Вы можете получить одно потоковое чтение из исходного файла, а другое - в новую преобразованную копию файла.

0 голосов
/ 30 января 2012

Однако я не нашел способа использовать 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");                
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...