Значения, разделенные запятой
Значения, разделенные запятой (Comma-Separated Values — CSV), — так называется естественный и широко распространенный способ представления табличных данных. Каждая строка таблицы соответствует строке текста; поля в строке разделены запятыми. Таблица из главы 3, представленная в формате CSV, начиналась бы так:
Этот формат используется для чтения и записи различными программами, работающими с электронными таблицами. Используется он и на некоторых Web-страницах, например для выдачи справок о биржевых котировках. Одна из популярных страниц с биржевыми курсами представляет информацию примерно так:
Биржевой символ | Последние торги | Изменения | Объем | ||
LU | 2:19РМ | 86-1/4 | +4-1/16 | +4,94 % | 5 804 800 |
Т | 2:19РМ | 60-11/16 | -1-3/16 | -1,92% | 2468000 |
MSFT | 2:24РМ | 106-9/16 | +1-3/8 | + 1,31 % | 11474900 |
Загружаемый табличный формат
Получать значения с помощью Web-браузера удобно, но долго. Вы запускаете браузер, ждете, потом на вас вываливается поток рекламы, вы выбираете список котировок, опять ждете, ждете, ждете, опять лицезрее-те рекламу и т. д. — и все для того, чтобы получить несколько чисел. Для дальнейшей обработки значений вам придется повторить весь процесс еще не один раз, а между тем, выбрав ссылку "Download Spreadsheet Format" (скачать в табличном формате), вы сразу получите файл, содержащий в основном ту же самую информацию в виде данных в формате CSV — примерно такого вида (здесь строки откорректированы нами по длине):
Сразу ясно, что второй способ проще: за вас работает компьютер. Браузеры
позволяют вашему компьютеру получать доступ к данным с удаленного сервера,
но гораздо лучше получать данные без необходимости муторного личного участия.
Надо отметить, что на самом деле все нажимания на кнопки — не более чем
некая текстовая процедура: браузер читает некий HTML, вы вводите некий
текст, и браузер отсылает его на сервер, получая в ответ какой-то новый
HTML. Имея нормальные инструменты и язык программирования, нетрудно добиться
получения информации в автоматическом режиме. Вот текст программы на языке
Tel, обращающейся к Web-сайту биржевых курсов и возвращающей данные в
формате CSV, предваренные несколькими заголовочными строками:
Таинственная последовательность f =. . ., следующая за аббревиатурами
биржевых сводок, — недокументированная управляющая строка (аналог первого
аргумента printf), определяющая, какие данные требуется получить. Экспериментальным
путем мы выяснили, что s задает код акций, 11 — последнюю цену, d — изменение
цены по сравнению со вче-' рашним днем и т. п. Важны здесь не конкретные
детали, которые могут всячески меняться, а открывающаяся возможность автоматизации
получения нужной информации и преобразования ее в нужный вид без участия
пользователя. Пусть работает железный агрегат.
Для того чтобы запустить getquotes, вам потребуются какие-то доли секунды, — это несравненно быстрее, чем возиться с браузером.
Получив данные, мы, естественно, захотим подвергнуть их дальнейшей обработке. С форматами данных вроде CSV лучше всего работать, если есть удобные библиотеки, осуществляющие преобразования из формата в формат и, возможно, соединенные с вспомогательными операциями типа преобразования чисел. Однако мы не знаем ни одной доступной бесплатной библиотеки для обработки CSV, поэтому напишем свою.
В нескольких последующих разделах мы создадим три версии библиотеки для чтения и преобразования данных CSV. Попутно мы обсу-! дим аспекты, неизбежно возникающие при проектировании программ, взаимодействующих с другими программами. Так, например, оказалось, что стандартного определения CSV не существует, поэтому наша реализация не может базироваться на точной спецификации, — это обычная ситуация при проектировании интерфейсов.