Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика программирование, учебник.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
22.08 Mб
Скачать

Экспорт данных. Копирование информации из файла записей в текстовый файл

Пример 11. Информацию из файла записей Students.dat, упорядочить в алфавитном порядке фамилий студентов и вывести в текстовый файл Students.txt. Каждую запись оформить в виде строки, заканчивающуюся точкой с запятой. Информацию из полей TAB, FIO, DATA, GRUP, STEPA разделить запятыми.

Ниже приведен код программы имеющей следующий алгоритм.

  • Ввести с клавиатуры в строку St путь и имя файла записей Students.dat. Открыть файл записей St для чтения.

  • Для упорядочения записей в алфавитном порядке фамилий студентов будем использовать индексный файл, поэтому в строку Sti введем с клавиатуры путь и имя индексного файла. В нашем случае это A:\Students.ntx.

  • Откроем индексный файл Sti для чтения.

  • Сделаем программу более гибкой чем исходные условия. Введем с клавиатуры в переменную CH литерного типа (CHAR) литеру - разделитель полей, в нашем случае это запятая.

  • Введем с клавиатуры в переменную CH1 литерного типа (CHAR) литеру - разделитель записей, в нашем случае это точка с запятой. Но следует заметить, что точка с запятой как разделитель не является обязательным атрибутом формируемого текстового файла. Она лишь логически отделяет строку текста от следующей строки. Фактическим разделителем строк является EOLN, то есть два байта: возврат каретки, перевод строки. Именно поэтому каждая строка начинается с первой позиции текста.

  • На основании пути и имени основного файла сформируем строку Stx - путь и имя выходного текстового файла A:\Students.txt путем замещения расширения .dat на расширение .txt.

  • Создадим новый текстовый файл и именем Stx.

  • Будем читать запись за записью из индексного файла Sti, пока не достигнем конца файла. Для каждой записи индексного файла будем считывать соответствующую запись их основного файла St. На основании этой записи будем формировать строку Strb, как сцепку полей и разделителей S_TAB + CH + S.FIO + CH + S.Data + CH + S.Grup + CH + S_STEPA + CH1. Вывод строки Strb в текстовый файл Stx.

  • Закрыть все три файла: St, Sti, Stx.

PROGRAM PR11;

{СОЗДАНИЕ ТЕКСТОВОГО ФАЙЛА, СОДЕРЖАЩЕГО ВСЕ ЗАПИСИ ОСНОВНОГО ФАЙЛА, УПОРЯДОЧЕННЫЕ В СООТВЕТСТВИИ С ИНДЕКСНЫМ ФАЙЛОМ С ИМЕНЕМ СТАРОГО ОСНОВНОГО ФАЙЛА И РАСШИРЕНИЕМ .TXT.

ПОЛЕ ОТ ПОЛЯ ОТДЕЛЯЕТСЯ РАЗДЕЛИТЕЛЕМ CH - ВВОДИМЫМ С КЛАВИАТУРЫ.

В КОНЦЕ ЗАПИСИ СИМВОЛ CH1 - ВВОДИМЫЙ С КЛАВИАТУРЫ.

КОПИРУЮТСЯ ТОЛЬКО ПОЛЯ TAB, FIO, DATA, GRUP, STEPA}

Type Student = record

Tab : Longint;

Fio : String[15];

Data : String[8];

Grup : String[7];

Stepa: Real;

DEL: BYTE;

DATE: STRING[8]

end;

Index = record

Fio : String[15];

Namber: integer

End;

Var L:Index; S:Student; St,Sti,Stx, Strb:String;

S_STEPA, S_TAB: String; CH, CH1: CHAR;

Fs: File of Student; Fi: File of Index;

FTXT: TEXT;

Begin

Writeln('Введите имя основного файла: '); Readln(St);

Assign (Fs,St); Reset(Fs);

Writeln('Введите имя индексного файла: '); Readln(Sti);

Writeln('Введите Разделитель полей: '); Readln(CH);

Writeln('Введите Разделитель записей: '); Readln(CH1);

Assign (Fi, Sti); Reset(Fi);

Stx:=COPY(ST,1,POS('.',ST)-1)+'.txt';{ПУТЬ И ИМЯ ТЕКСТОВОГО ФАЙЛА}

Assign (FTXT, Stx); Rewrite(FTXT);

While Not Eof(Fi) {ПРОСМОТР ИНДЕКСНОГО ФАЙЛА}

Do begin

Read(Fi, L);

Seek(Fs, L.Namber);

Read(Fs, S); {Чтение соотв. записи из основного файла}

WRITELN(S.TAB:9, S.FIO:15, S.Data:10, S.Grup:9, S.STEPA:9:2);

STR(S.TAB, S_TAB); {ПЕРЕВОД ЧИСЛА В СТРОКУ ТЕКСТА}

STR(S.STEPA:4:2, S_STEPA);

Strb := S_TAB+CH+S.FIO+CH+S.Data+CH+S.Grup+CH+S_STEPA+CH1;

WRITELN(FTXT, Strb) {ВЫВОД СТРОКИ В ТЕКСТОВЫЙ ФАЙЛ}

end;

Close(Fs); Close(Fi); Close(FTXT);

End.

В результате работы программы выходной текстовый файл Students.txt будет иметь следующие строки:

100010,АНИСИМОВ,11.04.91,ИС-11,500.00;

100000,АФАНАСЬЕВ,01.02.90,ПИ-11,500.00;

100012,БУНАКОВ,21.06.90,ИС-11,850.00;

100002,ВАСИЛЬЕВ,15.01. 91,ПИ-11,350.00;

100016,ВАХРУШЕВА,13.02. 91,ИС-11,350.00;

100007,ВЕЙНЕРМАН,09.06. 90,ПИ-11,500.00;

100017,ВЫСОЦКИЙ,06.08. 90,ИС-11,850.00;

100005,ГАВРИЛОВ,10.12. 90,ПИ-11,850.00;

100019,ГОРОХОВ,15.09. 90,ИС-11,500.00;

100009,ЗИБЕРМАН,13.09. 91,ИС-11,0.00;

100006,ИВАНОВА,15.05. 91,ПИ-11,500.00;

100020,НЕКРАСОВА,13.09. 91,ИС-11,350.00;

100021,ПАВЛИНОВ,01.02. 91,ПИ-11,350.00;

100011,ПЕТРОВ,03.05. 91,ИС-11,350.00;

100014,СЕМЕНОВ,30.01. 91,ИС-11,500.00;

100018,СЕРЕГИНА,05.04. 91,ИС-11,500.00;

100004,СИДОРОВ,01.11. 91,ПИ-11,500.00;

100001,СЫЧЕВ,13.03. 91,ПИ-11,500.00;

100003,УШАКОВ,12.12.90,ПИ-11,0.00;

100013,ФАДЕЕВ,04.10. 90,ИС-11,350.00;

100023,ФОМИН,13.09.89,ИС-11,850.00;

100015,ЩУКИНА,15.03. 91,ИС-11,0.00;

100008,ЯКУШЕВ,24.10. 90,ПИ-11,0.00;