Книга: Windows Script Host для Windows 2000/XP

Разработка записной книжки в формате текстового файла

Разработка записной книжки в формате текстового файла

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

Предположим, что имеется файл book.txt, содержащий информацию из записной книжки в следующем формате:

Фамилия|Имя|Телефон|Улица|Дом|Кв.|Примечание

В качестве примера мы будем рассматривать файл book.txt, приведенный в листинге 5.20.

Листинг 5.20. Содержимое файла book.txt

Потапов|Сергей|55-55-55|Моховая|3|10|Без примечаний
Попов|Андрей|56-56-56|Ленина|3|5|Без примечаний
Иванов|Иван|17-17-17|Садовая|4|6|Очень хороший человек
Казаков|Сергей|24-19-68|Полежаева|101|22|Тоже очень хороший человек

Ниже приведен сценарий SortName.js, который реализует одну из функций для работы с записной книжкой — в результате работы этого сценария все записи из book.txt сортируются по фамилии и отображаются в Блокноте (рис. 5.14).

Опишем кратко алгоритм работы сценария SortName.js.

1. Информация из файла book.txt считывается в массив PersonArr. Каждый элемент массива является объектом типа Person, в котором хранятся все данные для одного человека.

2. Массив PersonArr сортируется в нужном порядке (в нашем случае — по возрастанию фамилий).

3. Содержимое всех записей из массива PersonArr выводится в текстовый файл out.txt.

4. Файл out.txt открывается в Блокноте.

Как мы видим, взаимодействие с текстовым файлом данных происходит только при загрузке его содержимого в массив. Поэтому остальная часть сценария не зависит от формата файла с данными и может в дальнейшем применяться без изменений для обработки файлов в XML-формате.


Рис. 5.14. Содержимое записной книжки (сортировка по фамилии)

Запускной функцией в SortName.js является функция Main():

function Main() {
 //Создаем объект WshShell
 WshShell = WScript.CreateObject("WScript.Shell");
 //Определяем пути к файлам
 InitPath();
 //Создаем объект FileSystemObject
 FSO=WScript.CreateObject("Scripting.FileSystemObject");
 //Открываем выходной файл для записи
 FOut=FSO.OpenTextFile(PathOut,ForWriting,true);
 //Печатаем заголовок отчета
 TopReport("Сортировка по фамилии");
 //Выводим содержимого файла с данными
 ListFile();
 //Печатаем итоговую информацию
 BottomReport();
 //Открываем выходной файл в Блокноте
 MakeOut();
}

Итак, основная работа по формированию выходного файла, который затем будет открыт в Блокноте, производится в функции ListFile(). В свою очередь, в этой функции вызываются функции FileToArray() и ListPersonArray().

function ListFile() {
 //Считывание данных из файла в массив
 FileToArray();
 //Запись информации из массива в выходной файл
 ListPersonArray();
}

Опишем сначала функцию FileToArray(). Здесь производится создание массива PersonArr, чтение в цикле while строк из файла book.txt (с помощью метода ReadLine) и формирование массива ss (с помощью метода split), элементы которого содержат данные для текущей записи. После этого вызывается функция PersonToArray() для создания нового элемента массива PersonArr:

function FileToArray() {
var s,ss;
 //Открываем файл с данными для чтения
 FBook=FSO.OpenTextFile(PathBook,ForReading,true);
 //Создаем массив PersonArr
 PersonArr=new Array(); 
 //Читаем содержимое файла FBook
 while (!FBook.AtEndOfStream) {
  //Считываем строку
  s=FBook.ReadLine();
  //Записываем содержимое строки s в массив ss
  ss = s.split("|");
  //Добавляем новый элемент в массив объектов Person
  PersonToArray(ss);
 }
 //Закрываем файл
 FBook.Close();
}

В функции PersonToArray(sArr) из элементов массива sArr формируется экземпляр PersonRec объекта Person. После этого объект PersonRec добавляется в массив PersonArr:

function PersonToArray(sArr) {
 //Создаем новый объект Person
 PersonRec=new Person(sArr[0], sArr[1], sArr[2], sArr[3], sArr[4], sArr[5], sArr[6]);
 //Сохраняем объект Person в массиве
 PersonArr[PersonArr.length]=PersonRec;
}

Конструктор объекта Person имеет следующий вид:

function Person(LastName,Name,Phone,Street,House,App,Note) {
 this.LastName=LastName; //Фамилия
 this.Name=Name;         //Имя
 this.Phone=Phone;       //Телефон
 this.Street=Street;     //Улица
 this.House=House;       //Дом
 this.App=App;           //Квартира
 this.Note=Note;         //Примечание
}

Перейдем теперь к рассмотрению функции ListPersonArray():

function ListPersonArray() {
var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 //Цикл по всем элементам массива PersonArr
 for (i=0;i<=PersonArr.length-1;i++) {
  //Запись информации в выходной файл
  PrintPerson(PersonArr[i]);
 }
}

Сначала здесь производится сортировка массива PersonArr в возрастающем порядке по фамилиям, для чего в качестве параметра метода sort указывается имя SortLastName функции, которая производит сравнение двух элементов массива:

function SortLastName(Pers1,Pers2) {
 if (Pers1.LastName<Pers2.LastName) return -1;
 else if (Pers1.LastName==Pers2.LastName) return 0;
 else return 1;
}

Замечание

Сортировать массивы подобным образом можно только в сценариях JScript, где массивы рассматриваются как объекты. В сценариях VBScript отсутствуют встроенные средства для сортировки массивов

После сортировки массива содержимое его элементов в цикле выводится в файл out.txt с помощью функции PrintPerson(PersRec):

function PrintPerson(PersRec) {
 FOut.WriteLine("Фамилия : "+PersRec.LastName);
 FOut.WriteLine("Имя : "+PersRec.Name);
 FOut.WriteLine("Телефон: "+PersRec.Phone);
 FOut.WriteLine("Улица: "+PersRec.Street);
 FOut.WriteLine("Дом: "+PersRec.House);
 FOut.WriteLine("Кв.: "+PersRec.App);
 FOut.WriteLine("Заметки: "+PersRec.Note);
 FOut.WriteLine("*********************************");
 //Увеличиваем счетчик числа записей
 NomRec++;
}

В листинге 5.21 приводится полный текст сценария SortName.js.

Листинг 5.21. Вывод содержимого записной книжки с сортировкой по фамилии

/*******************************************************************/
/* Имя: SortName.js                                                */
/* Язык: JScript                                                   */
/* Описание: Записная книжка (данные в текстовом файле book.txt).  */
/*           Вывод всех записей с сортировкой по фамилии           */
/*******************************************************************/
//Объявляем переменные
var
 WshShell,FSO,
 BasePath,  //Путь к текущему каталогу
 PathBook,  //Путь к файлу с данными
 PathOut,   //Путь к выходному файлу
 FBook,     //Файл с данными
 FOut,      //Выходной файл
 NomRec=0,  //Счетчик количества записей
 PersonRec, //Объект для хранения данных об одном человеке
 PersonArr; //Массив для хранения объектов PersonRec
//Инициализируем константы для работы с файлами
var 
 ForReading=1,
 ForWriting=2;
//Конструктор объекта Person
function Person(LastName,Name,Phone,Street,House,App,Note) {
 this.LastName=LastName; //Фамилия
 this.Name=Name;         //Имя
 this.Phone=Phone;       //Телефон
 this.Street=Street;     //Улица
 this.House=House;       //Дом
 this.App=App;           //Квартира
 this.Note=Note;         //Примечание
}
//Заполнение нового элемента массива
function PersonToArray(sArr) {
 //Создаем новый объект Person
 PersonRec=new Person(sArr[0], sArr[1], sArr[2], sArr[3], sArr[4], sArr[5], sArr[6]);
 //Сохраняем объект Person в массиве
 PersonArr[PersonArr.length]=PersonRec;
}
//Создание массива объектов Person
function FileToArray() {
var s,ss;
 //Открываем файл с данными для чтения
 FBook=FSO.OpenTextFile(PathBook,ForReading,true);
 //Создаем массив PersonArr
 PersonArr=new Array(); 
 //Читаем содержимое файла FBook
 while (!FBook.AtEndOfStream) {
  //Считываем строку
  s=FBook.ReadLine();
  //Записываем содержимое строки s в массив ss
  ss = s.split("|");
  //Добавляем новый элемент в массив объектов Person
  PersonToArray(ss);
 }
 //Закрываем файл
 FBook.Close();
}
//Запись в выходной файл итоговой информации
function TopReport(Mess) {
 FOut.WriteLine(Mess);
 FOut.WriteLine("--------------------");
 FOut.WriteLine("");
}
//Запись в выходной файл итоговой информации
function BottomReport() {
 FOut.WriteLine("Всего записей: "+NomRec);
}
//Запись данных из объекта Person в выходной файл
function PrintPerson(PersRec) {
 FOut.WriteLine("Фамилия : "+PersRec.LastName);
 FOut.WriteLine("Имя : "+PersRec.Name);
 FOut.WriteLine("Телефон: "+PersRec.Phone);
 FOut.WriteLine("Улица: "+PersRec.Street);
 FOut.WriteLine("Дом: "+PersRec.House);
 FOut.WriteLine("Кв.: "+PersRec.App);
 FOut.WriteLine("Заметки: "+PersRec.Note);
 FOut.WriteLine("*********************************");
 //Увеличиваем счетчик числа записей
 NomRec++;
}
//Сортировка массива и вывод его содержимого в выходной файл
function ListPersonArray() {
var i;
 //Сортировка массива по фамилии
 PersonArr.sort(SortLastName);
 //Цикл по всем элементам массива PersonArr
 for (i=0;i<=PersonArr.length-1;i++) {
  //Запись информации в выходной файл
  PrintPerson(PersonArr[i]);
 }
}
//Функция для сортировки массива по фамилии
function SortLastName(Pers1,Pers2) {
 if (Pers1.LastName<Pers2.LastName) return -1;
 else if (Pers1.LastName==Pers2.LastName) return 0;
 else return 1;
}
//Вывод содержимого файла с данными                                          
function ListFile() {
 //Считывание данных из файла в массив
 FileToArray();
 //Запись информации из массива в выходной файл
 ListPersonArray();
}
//Просмотр содержимого выходного файла в Блокноте
function MakeOut() {
 //Закрываем выходной файл
 FOut.Close();
 //Открываем выходной файл в Блокноте
 WshShell.Run("notepad "+PathOut,1);
}
//Построение путей к файлам
function InitPath() {
 BasePath=WshShell.CurrentDirectory+"";
 //Путь к файлу с данными
 PathBook=BasePath+"book.txt",
 //Путь к выходному файлу
 PathOut=BasePath+"out.txt";
}
//Основная запускная функция
function Main() {
 //Создаем объект WshShell
 WshShell = WScript.CreateObject("WScript.Shell");
 //Определяем пути к файлам
 InitPath();
 //Создаем объект FileSystemObject
 FSO=WScript.CreateObject("Scripting.FileSystemObject");
 //Открываем выходной файл для записи
 FOut=FSO.OpenTextFile(PathOut,ForWriting,true);
 //Печатаем заголовок отчета
 TopReport("Сортировка по фамилии");
 //Выводим содержимого файла с данными
 ListFile();
 //Печатаем итоговую информацию
 BottomReport();
 //Открываем выходной файл в Блокноте
 MakeOut();
}
/*******************  Начало  **********************************/
Main();
/*************  Конец *********************************************/
 

Оглавление книги


Генерация: 1.481. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз