Я уже затрагивал тему про CSV-файлы, а теперь пришло время обратить внимание на использование CSV при создании флеш-приложений. CSV - это простой и удобный способ хранения информации, который может быть востребован и при программировании на ActionScript. Тем более, что для ActionScript 3.0 существует специальная библиотека для работы с CSV - библиотека классов csvlib. Именно о ней мы сегодня и поговорим.
Рассмотрим основные операции с CSV, с которыми нам, скорее всего, придётся столкнуться, если мы всё же решимся воспользоваться библиотекой csvlib.
Загрузка внешнего файла CSV.
Первым дело нам надо создать сам csv-файл. Пусть он у нас будет называться mycsv.csv (подробнее о создании csv-таблиц смотрите тут).
Файл CSV:
id,name,score
1,Игрок №1,10
2,Игрок №2,5
3,Игрок №3,12
4,Игрок №4,3
5,Игрок №5,13
А теперь загрузим наш файл mycsv.csv в флеш-приложение.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создание экземпляра класса CSV
*/
var csv:CSV = new CSV();
/*
начинаем загрузку csv-файла и ловим момент окончания загрузки
*/
csv.addEventListener(Event.COMPLETE, onComplete);
csv.load(new URLRequest('mycsv.csv'));
function onComplete(event:Event)
{
/*
одномерный массив с заголовками таблицы
*/
trace(csv.header);
/*
многомерный массив с содержимым таблицы
*/
trace(csv.data);
}
Как видите, ничего сложного.
По-умолчанию ожидается таблица с заголовком (заголовком в CSV-таблице является первая строка-запись, в которой хранятся названия всех полей данной таблицы). Если заголовка нет, то надо это явно указать с помощью свойства embededHeader. А если мы этого не сделаем, то парсер посчитает за заголовок первую запись в таблице, что, конечно, неправильно.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создание экземпляра класса CSV
*/
var csv:CSV = new CSV();
/*
явно указываем, что таблица не имеет заголовка
*/
csv.embededHeader = false;
/*
начинаем загрузку csv-файла и ловим момент окончания загрузки
*/
csv.addEventListener(Event.COMPLETE, onComplete);
csv.load(new URLRequest('mycsv2.csv'));
function onComplete(event:Event)
{
/*
многомерный массив с содержимым таблицы
*/
trace(csv.data);
}
Сам же файл mycsv2.csv будет выглядеть следующим образом (сравните его с файлом mycsv.csv и заметите отсутствие заголовка).
Файл CSV:
1,Игрок №1,10
2,Игрок №2,5
3,Игрок №3,12
4,Игрок №4,3
5,Игрок №5,13
К сожалению, CSV не имеет жестких стандартов и разделители внутри csv-файлов могут быть разными. Данная библиотека учитывает подобную особенность csv-файлов и имеет в своём арсенале несколько специальных свойств, с помощью которых можно прочитать и изменить символы-разделители:
- fieldSeperator - отвечает за символ-разделитель между полями таблицы (по-умолчанию таким символом является запятая);
- recordsetDelimiter - отвечает за символ-разделитель между записями в таблице (по-умолчанию - невидимый \r - символ возврата каретки);
- fieldEnclosureToken - отвечает за символ-разделитель, обозначающий границы отдельной ячейки таблицы (по-умолчанию - одинарные кавычки).
А теперь для тренировки создадим csv-файл с нестандартными разделителями и загрузим его в флеш-проект.
Файл CSV:
id;name;score#1;Игрок №1;11#2;"человек, пожелавший остаться неизвестным";5#3;Игрок №3;12#4;Игрок №4;3#5;Игрок №5;13#
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создание экземпляра класса CSV
*/
var csv:CSV = new CSV();
/*
считываем и меняем разделитель полей
*/
trace(csv.fieldSeperator)
csv.fieldSeperator = ';';
/*
считываем и меняем символ-разделитель, обрамляющий ячейку
*/
trace(csv.fieldEnclosureToken)
csv.fieldEnclosureToken = '"';
/*
считываем и меняем разделитель записей
*/
trace(csv.recordsetDelimiter)
csv.recordsetDelimiter = '#';
/*
начинаем загрузку csv-файла и ловим момент окончания загрузки
*/
csv.addEventListener(Event.COMPLETE, onComplete);
csv.load(new URLRequest('mycsv2.csv'));
function onComplete(event:Event)
{
/*
одномерный массив с заголовками таблицы
*/
trace(csv.header);
/*
многомерный массив с содержимым таблицы
*/
trace(csv.data[1]);
}
Создание CSV-файла.
Используя данную библиотеку, мы в любой момент можем создать новый csv-документ. Например, мы может специально отформатированную строку превратить в CSV. Делается это довольно просто.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
присваиваем строку, которую нам надо превратить в CSV
*/
csv.data = 'id,name,score\r1,Игрок №1,11\r2,Игрок №2,5\r3,Игрок №3,12\r4,Игрок №4,3\r5,Игрок №5,13\r';
/*
превращаем строку в CSV
*/
csv.decode();
/*
проверяем CSV
*/
trace(csv.data[0][1]);
Обратите внимание на строку, которую мы превращаем в CSV. Она должна полностью соответствовать структуре csv-файла и содержать все необходимые разделители.
Существует и альтернативный способ создания csv-документа, при котором новые записи по одной добавляются к таблице.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
проверяем
*/
trace(csv.header);
trace(csv.data[0]);
Метод addRecordSet() может иметь второй параметр, который отвечает за положение данной записи в таблице. Сравните работу предыдущего кода со следующим:
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11'],-1);
/*
проверяем
*/
trace(csv.header);
trace(csv.data[0]);
Как видите, значение '-1' во втором параметре привело к тому, что записи поменялись местами.
Метод getRecordSet() возвращает запись из таблицы в виде массива. В качестве параметра данный метод принимает индекс записи, которую надо извлечь.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
считываем записи из CSV
*/
trace(csv.getRecordSet(0));
trace(csv.getRecordSet(1));
trace(csv.getRecordSet(1)[1]);
Удаление записей из CSV.
Метод deleteRecordSet() удаляет запись (или записи) из таблицы. Если надо удалить только одну запись, то передайте данному методу в качестве параметра индекс этой записи. А если надо удалить несколько идущих друг за другом записей, то передайте в качестве параметра два значения: начальный и конечный индекс удаляемых записей.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
удаляем запись
*/
csv.deleteRecordSet(0);
/*
проверяем
*/
trace(csv.data);
Поиск записей в CSV.
Для поиска похожих записей в таблице можно использовать метод search(). Он может принимать два параметра: искомая запись и булево значение, которое отвечает за удаление результатов-дубликатов.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
csv.addRecordSet(['3','Игрок №3','22']);
/*
ищем похожие записи в таблице
*/
trace(csv.search(['1','Игрок №1','22']));
Сортировка записей в CSV.
Метод sort() позволяет отсортировать записи в таблице. Для примера отсортируем записи по полю id.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['3','Игрок №3','4']);
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
сортируем
*/
csv.sort(0);
/*
проверяем
*/
trace(csv.data)
или
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['3','Игрок №3','4']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
сортируем
*/
csv.sort('id');
/*
проверяем
*/
trace(csv.data)
А теперь отсортируем в обратном порядке.
Код ActionScript 3.0:
/*
подключение библиотеки
*/
import com.shortybmc.data.parser.CSV;
/*
создаём экземпляр класса
*/
var csv:CSV = new CSV();
/*
устанавливаем заголовок таблицы
*/
csv.embededHeader = false;
csv.header = ['id', 'name', 'score'];
/*
добавляем записи в таблицу
*/
csv.addRecordSet(['3','Игрок №3','4']);
csv.addRecordSet(['1','Игрок №1','22']);
csv.addRecordSet(['2','Игрок №2','11']);
/*
сортируем
*/
csv.sort(0,'DES');
/*
проверяем
*/
trace(csv.data)
Исходник к данному уроку под Adobe Flash CS5.5 и саму библиотеку классов csvlib скачать можно здесь.