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

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

Пример 12. Информацию из текстового файла Students.txt (см. пример 11) копировать в файл записей Students.dat в том порядке как они присутствуют в текстовом файле.

Алгоритм этой программы весьма прост.

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

  • Открываем файл базы данных Students.dat для записи.

  • Читаем очередную строку текста Strb из файла Students.txt, пока не будет достигнут конец файла.

  • Из строки Strb выделяем поля S.TAB, S.FIO, S.Data, S.Grup, S.STEPA.

  • Сохраняем текущую запись S в файле Students.dat.

  • Когда достигнут конец файла Students.txt, закрываем файлы Students.txt и Students.dat.

PROGRAM PR12;

{Создание основного файла, содержащего все записи текстового

файла упорядоченные в соответствии с текстовым файлом

с именем текстового файла и расширением .dat.

Копируются только поля 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;

Var S:Student; St, Stx, Strb, Strс: String; N: Integer;

S_STEPA, S_TAB: String;

Fs: File of Student; FTXT: TEXT;

Begin

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

Assign (FTXT, St); Reset(FTXT);

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

Assign (Fs, Stx); Rewrite(Fs);

While Not Eof(FTXT) {ПРОСМОТР ТЕКСТОВОГО ФАЙЛА}

Do begin

Readln(FTXT, Strb); {ЧТЕНИЕ СТРОКИ ИЗ ТЕКСТОВОГО ФАЙЛА}

Strс:=COPY(Strb,1,POS(',',Strb)-1);

DELETE(Strb,1,POS(',',Strb));

VAL(Strс, S.TAB, N);

S.FIO:=COPY(Strb,1,POS(',',Strb)-1);

DELETE(Strb,1,POS(',',Strb));

S.Data:=COPY(Strb,1,POS(',',Strb)-1);

DELETE(Strb,1,POS(',', Strb));

S.Grup:=COPY(Strb,1,POS(',',Strb)-1);

DELETE(Strb,1,POS(',',Strb));

Strb := COPY(Strb,1,POS(';',Strb)-1); VAL(Strb,S.STEPA,N);

WRITE(Fs, S); { ЗАПИСЬ В ОСНОВНОЙ ФАЙЛ }

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

end;

Close(Fs); Close(FTXT)

End.

3.8 Запросы к файлам записей

Одним из важнейших вычислительных процессов является формирование запросов к данным, хранимым в файлах записей. Собственно ради таких запросов и создают файлы записей. Запрос представляет собой программу, которая выбирает из одного или нескольких файлов записей данные и выдает их в виде таблицы на экран монитора, или в текстовый файл. При этом происходит фильтрация записей, то есть отбор только тех записей, которые удовлетворяют определенным, заранее известным условиям. Запросы к базам данных представляют самостоятельный предмет исследования. Очень широко запросы используются в языках программирования, использующих SQL (Structured English Query Language). В языке SQL имеется целый спектр запросов различных назначений. Мы остановимся только на двух из них: запрос - выборка, запрос с группировкой.

Запрос - выборка

Запрос этого вида не изменяет информацию в исходных файлах. Этот запрос отбирает из всех записей только те, которые удовлетворяют условиям отбора. В выходную таблицу могут помещаться только необходимые поля из исходной базы. Помимо этих полей могут для каждой записи формироваться новые данные (расчетные поля) путем простых арифметических преобразований данных из исходных полей.

Пример 13. Разработать запрос к файлу Students.dat, обеспечивающий выборку студентов, указанной с клавиатуры группы. В выходную таблицу поместить четыре поля: табельный номер, фамилию и инициалы студента, возраст (полное количество лет на указанную дату), стипендия. Результаты вывести в текстовый файл OUTPUT.TXT.

Алгоритм запроса содержит следующие позиции:

  • Открываем файл базы данных Students.dat для чтения.

  • Открываем текстовый файл Output.txt для записи.

  • С клавиатуры вводим код группы StGR и дату StDT на которую мы хотим сформировать список студентов.

  • Выводим заголовок в текстовый файл Output.txt.

  • Читаем очередную запись S из файла Students.dat, пока не будет достигнут конец файла.

  • Если студент принадлежит интересующей нас группе (S.Grup = StGR), то преобразуем числовые поля в текстовые (S.TAB → S_TAB, S.STEPA→ S_ STEPA). Формируем строку текста из реквизитов: S_TAB, S.FIO, FTXT, DATEDIFF(S.Data, StDT), S_STEP. Выводим эту строку в текстовый файл Output.txt.

  • Когда достигнут конец файла Students.dat, закрываем файлы Students.dat и Output.txt.

  • Наибольший интерес в предлагаемой программе представляет способ вычисления возраста студентов. Для работы с полями типа дата в языке Паскаль нет встроенных функций. Поэтому пришлось в программе разработать пользовательскую функцию DATEDIFF(DT1, DT2), которая возвращает разность между двумя датами DT1 и DT2. Разность между двумя датами измеряется разными единицами измерения: дни, месяцы, годы. В нашем случае это годы. Для сравнения двух дат их следует разложить на компоненты: количество дней, месяцев, лет. Для этих целей используются функции DAY, MONTH, YEAR, соответственно.

Функция DATEDIFF(DT1, DT2) Структурограмма

Y1 = YEAR(DT1); M1 = MONTH(DT1); D1 = DAY(DT1); {Компоненты первой даты}

Y2 = YEAR(DT2); M2 = MONTH(DT2); D2 = DAY(DT2); {Компоненты второй даты}

R = Y2 - Y1; {Разность лет}

(M2 < M1) or ((M2 = M1) and (D2<D1))

Анализ месяцев и дней да

R = R-1; {Коррекция R, так как последний год - неполный}

DATEDIFF := R.

PROGRAM PR130;

Type Student = record

tab : Longint;

Fio : String[15];

Data : String[8];

Grup : String[7];

Stepa: Real;

DEL: BYTE;

DATE: STRING[8]

end;

Var S: Student; St: String;

StGR: String[7]; StDT: String[8];

S_STEPA, S_TAB: String;

Fs: File of Student; FTXT: TEXT;

FUNCTION DATEDIFF(DT1,DT2:String):Integer; {Число полных лет между DT2 и DT1}

VAR Y1,Y2,M1,M2,D1,D2:Integer; R: Integer;

FUNCTION DAY(DT: String): Integer; {Вычисляет день по дате}

VAR T: STRING; S, N: Integer;

Begin

T:= COPY(DT,1,2); VAL(T, S, N); Day :=S

End;

FUNCTION MONTH(DT: String):Integer; {Вычисляет месяц по дате}

VAR T: STRING; S, N: Integer;

Begin

T:= COPY(DT,4,2); VAL(T, S, N); MONTH :=S

End;

FUNCTION YEAR(DT: String):Integer; {Вычисляет год по дате}

VAR T: STRING; S, N: Integer;

Begin

T:= COPY(DT,7,2); VAL(T, S, N);

IF S<11 {Программа верна до 2010 года}

THEN S:=S+2000 ELSE S:=S+1900;

YEAR := S

End;

BEGIN

Y1:= YEAR(DT1);M1:= MONTH(DT1);D1:= DAY(DT1);

Y2:= YEAR(DT2);M2:= MONTH(DT2);D2:= DAY(DT2);

R:=Y2-Y1;

IF (M2 < M1) or ((M2 = M1) and (D2<D1)) THEN R:=R-1;

DATEDIFF := R

End;

Begin

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

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

Writeln('Введите код группы: ');Readln(StGR);

Writeln('Укажите дату: ');Readln(StDT);

Assign (FTXT,'Output.txt'); Rewrite(FTXT);

WRITELN(FTXT, ' Список студентов группы ',StGR);

WRITELN(FTXT, 'с указанием возраста (полных лет) на ',StDT);

WRITELN(FTXT, 'Таб.номер Фамилия И.О. Возраст Стипендия, руб.');

While Not Eof(Fs) {Просмотр индексного файла}

Do begin

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

IF S.Grup = StGR

THEN BEGIN

STR(S.TAB, S_TAB); {Перевод числа в строку текста}

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

WRITELN(FTXT, S_TAB:7, S.FIO:15, DATEDIFF(S.Data, StDT):7, S_STEPA:12);

END

END;

Close(Fs); Close(FTXT)

End.

Результаты работы программы содержатся в текстовом файле Output.txt:

Список студентов группы ИС-11

с указанием возраста (полных лет) на 19.02.07

Таб.номер Фамилия И.О. Возраст Стипендия, руб.

100010 АНИСИМОВ 17 500.00

100012 БУНАКОВ 18 850.00

100016 ВАХРУШЕВА 18 350.00

100017 ВЫСОЦКИЙ 18 850.00

100019 ГОРОХОВ 18 500.00

100009 ЗИБЕРМАН 17 0.00

100020 НЕКРАСОВА 17 350.00

100011 ПЕТРОВ 17 350.00

100014 СЕМЕНОВ 18 500.00

100018 СЕРЕГИНА 17 500.00

100013 ФАДЕЕВ 18 350.00

100023 ФОМИН 19 850.00

100015 ЩУКИНА 17 0.00