Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 21.22.doc
Скачиваний:
2
Добавлен:
11.07.2019
Размер:
102.4 Кб
Скачать

5. Коррекция текстовых файлов.

Под коррекцией в широком смысле понимают изменение содержания файла. Можно выделить две группы основных процедур коррекции: обновление записей файла и удаление "лишних" записей. При этом критерии обновления и определения "лишних" записей допускают много возможных трактовок. Так критерием обновления может быть время существования записи, а критерием "лишних" записей - дублирование записей в файле. Разумеется, обе группы процедур коррекции могут взаимодействовать друг с другом, т.е. использоваться совместно. Для текстовых файлов Турбо Паскаля коррекция возможна только путём создания нового файла со скорректированными записями-строками. Ниже приводится пример простой программы коррекции текстового файла, решающей задачу "чистки файла" от записей-дублей и пустых записей (состоящих из пустых строк или строк из одних пробелов):

program clean_file;{ Чистка текстового файла от повторяющихся строк}

var f,outf:text; {Входной и выходной файлы}

nm,s,del_s:string; j,k,beg,c:integer; d,d1:Boolean;

BEGIN writeln('ПРОГРАММА ЧИСТКИ ФАЙЛА');writeln;

repeat write('Введите имя файла:');readln(nm);

{ Проверка существования и открытие файла f для чтения}

assign(f,nm);{$I-}reset(f);{$I+}

if IOResult <>0 then begin writeln('Ошибка в имени файла');nm:='' end;

until (nm<>'');k:=0; d:=true;c:=0; assign(outf,'OUTF');rewrite(outf);

repeat {основной цикл}

readln(f,s);del_s:=s;reset(f);inc(k);beg:=1;

{ d:=false, если строка s повторяется }

repeat readln(f,s);if (s=del_s) and (beg<k) then d:=false;inc(beg);

until (eof(f) or (beg>k)) {конец d:=false};d1:=false;

{d1:=true, если s cодержит символ-непробел}

for j:=1 to length(del_s) do

if del_s[j]<>' ' then d1:=true {конец d1:=true};

{Вывод неповторяющейся строки, отличной от строки пробелов}

if (d and d1) then writeln(outf,del_s);

if (not d) and d1 then

{Вывод повторяющейся строки, отличной от строки пробелов}

begin if c=0 then writeln('Повторяющиеся строки:');

writeln(del_s);inc(c);

end;

d:=true;

until eof(f) {конец основного цикла};

close(outf); if c=0 then writeln('Повторяющихся строк нет')

else writeln('Всего ',c,' повторяющихся строк');

END{clean_file}.

Заметим, что эта задача может быть решена более просто, если предварительно отсортировать файл, например, по возрастанию записей (в лексикографическом порядке строк).

6. Поиск и выборка данных из файлов.

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

program search;

{ Выборка из файла данных о группе студентов}

uses CRT;

type stud =record num:byte;name:string[20];average:real end;

gr_st=file of stud{данные о группе студентов};

var gr:gr_st{группа студентов};

st:stud{запись о студенте};

nm:string{имя исходного файла};

avr:string{условие для average};

sgn:string[1]{знак в условии};ball:real{запрошенный балл};

pr:boolean{признак выбранной записи};k:integer{кол-во выборок};

er:integer{ошибка преобразования в число};

BEGIN clrscr;repeat {открытие файла на чтение}

write('Введите имя файла:'); readln(nm);

if nm='' then halt;assign(gr,nm);

{$I-} reset(gr);{$I+} if IOResult<>0 then nm:='';

until nm<>''; {анализ запроса }

repeat write('Введите запрос для среднего балла: ');readln(avr);

sgn:=copy(avr,1,1);avr:=copy(avr,2,length(avr)-1);

val(avr,ball,er); if er<>0 then ball:=0;

until (ball>=2)and(ball<=5); k:=0; writeln('Запрошенные данные:');

repeat {реализация запроса к файлу nm}

read(gr,st);with st do

begin if sgn='>' then pr:=average>ball else pr:=average<=ball;

if pr then begin writeln(name,average:1:2);inc(k);delay(1000) end

end until eof(gr);if k<>0 then writeln('Всего студентов: ',k)

else writeln('Пустая выборка');readkey

END {search}.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]