Значения, разделенные запятой
Значения, разделенные запятой (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 не существует, поэтому наша реализация не может базироваться на точной спецификации, – это обычная ситуация при проектировании интерфейсов.