Кратко

  • RFC 4180 октября 2005 года описал распространённый формат CSV и зарегистрировал text/csv. Это информационный RFC: он признавал различия между программами и предлагал необязательный параметр для обозначения строки заголовков.
  • RFC 7111 января 2014 года определил фрагменты #row=4, #col=2, #cell=4,1 для выбора строк, столбцов и ячеек. Счёт начинается с единицы. Клиент, не понимающий такие фрагменты, всё равно получает файл целиком.
  • Номер указывает место в полученной версии, а не постоянную идентичность записи. Вставка строки выше четвёртой меняет то, что выберет старый #row=4. Сервер не может надёжно определить, использовал ли клиент фрагмент при запросе файла.

Адрес для одной строки

Учреждение публикует перечень решений в CSV. Автор статьи хочет сослаться на запись в четвёртой строке. Обычная ссылка ведёт ко всему файлу и заставляет читателя искать. Если дописать #row=4, ссылка выглядит как точный адрес нужного факта. Её удобно перенести в сноску и проверить кликом.

Такой адрес описан в RFC 7111, вышедшем в январе 2014 года. Документ добавил фрагменты URI для файлов типа text/csv: row обозначает строку, col — столбец, cell — отдельное поле. В собственном примере стандарта data.csv#row=4 выбирает четвёртую строку. Первая строка там содержит названия столбцов, поэтому выбранная строка — лишь третья запись с данными. Простой вопрос «считать ли заголовок?» уже определяет, какой факт увидит читатель.

С CSV порядок был не таким строгим, каким кажется новый фрагмент. RFC 4180 октября 2005 года зарегистрировал тип text/csv и описал распространённые соглашения о запятых, кавычках, переводах строк и заголовках. Во введении сказано, что файлы давно переходили между электронными таблицами без единого формального описания. Автор документа признавал заметные различия между реализациями. Этот информационный RFC фиксировал работающий обычай, а не превращал все программы в один идеальный парсер.

Наличие заголовка может передаваться необязательным параметром header=present или header=absent. Когда параметра нет, читающая программа решает сама. Фрагмент RFC 7111 при этом считает физические строки начиная с единицы. «Четвёртая запись» в файле с заголовком занимает пятую строку. Прежде чем делать ссылку на строку, нужно выяснить, как устроена таблица.

Номер помнит место, но не его владельца

Механизм 2014 года умеет выделять разные формы. #col=2 выбирает второй столбец; #cell=4,1 — первое поле четвёртой строки. Дефис задаёт диапазон, звёздочка обозначает последнюю строку или столбец, точка с запятой соединяет отдельные выборки. Для автора исследования это удобный набор: можно указать часть чужого файла, не заставляя его владельца делать отдельную веб-страницу для каждого поля.

Внутри #row=4 нет ключа записи, контрольной суммы ожидаемого значения или даты версии. Программа получает нынешний файл и отсчитывает четыре строки. Если строка существует, она может выделить её совершенно правильно. Что находилось там в момент публикации исследования, из фрагмента не узнать.

Предположим, четвёртая строка прежде содержала положительное решение. Позже составитель добавил в начало пропущенную более раннюю запись. Решение переместилось на пятую строку. Старая ссылка открывает файл, её синтаксис безупречен, а четвёртая строка по-прежнему есть. Проверка доступности URL выдаст успех. Между тем выделенный элемент рассказывает уже о другом решении.

Если убрать строку выше цели, сдвиг произойдёт в обратную сторону. Повторная сортировка способна переставить множество записей. Добавление столбца раньше указанной ячейки изменит результат #cell=. Здесь не нужна ошибка браузера: всё следует из позиционной семантики RFC 7111. Клиент, строго выполняющий инструкцию, может привести читателя к неправильному доказательству старой фразы.

Для доказательства реального случая понадобятся две датированные версии файла и место одной записи в каждой из них. Первичные тексты показывают механизм, но не описывают конкретного инцидента. Недостающий документ для проверки любой отдельной сноски — именно та версия CSV, которую видел её автор.

Сервер отдаёт файл и не видит указки

Роль символа # определена не только для CSV. RFC 3986 января 2005 года описывает фрагмент URI как косвенную ссылку, которую обрабатывает клиент. Перед получением основного ресурса фрагмент отделяется. Его значение зависит от типа полученного содержимого, а нужную часть определяет программа пользователя. RFC 7111 приложил этот принцип к text/csv.

Сервер не получает команду «пришли четвёртую строку». Он отдаёт всю таблицу. Клиент, поддерживающий синтаксис, сам выбирает фрагмент после получения. Документ 2014 года прямо говорит, что сервер не имеет надёжного способа узнать, использовал ли клиент при запросе фрагмент. Журнал доступа подтверждает выдачу файла, но не то, какую строку автор ссылки хотел показать.

Разные читатели могут увидеть разное. Программа с поддержкой фрагментов выделит строку. Программа без неё откроет или скачает весь CSV. Спецификация рассматривает это как обычную черту постепенного внедрения: базовый адрес остаётся рабочим. Ссылка выглядит узкой, а у части аудитории открывает весь набор данных.

Такое устройство даёт автору ссылки независимость от владельца файла. Можно указать на часть опубликованной таблицы, не меняя чужой сервер и не заказывая новый API. Но ответ сервера не подтверждает, что выбранный фрагмент был показан или прочитан. Эта часть действия происходит в программе получателя, за границей серверного журнала.

RFC 7111 устанавливает правила для недопустимых позиций. Ошибочный синтаксис игнорируется без попытки угадать намерение. Отдельная строка за концом файла не выбирается; диапазон, уходящий дальше последней строки, ограничивается размером файла. Правила умеют справляться с невозможным номером. Они не умеют отличать правильный номер с новым содержимым от правильного номера со старым содержимым.

Раздел безопасности предупреждает и о различии экранов: один клиент покажет выбранный фрагмент, другой — весь CSV, что может ввести пользователей в заблуждение. Текст задаёт поведение программы, которая реализовала механизм, но не перечисляет выпуски браузеров с такой реализацией. Датированные записи разработки дали бы отдельную историю внедрения.

Ссылка переживает собственное доказательство

Простота CSV делала публикацию данных дешёвой: экспортировать файл легче, чем построить сервис записей. RFC 4180 дал распространённой практике медийное имя, RFC 7111 — способ сослаться на отдельный участок. Производителю и исследователю это экономит работу. Для долгой жизни доказательства одной координаты мало.

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

RFC 7111 вышел как независимое информационное предложение; изменение регистрации text/csv получило требуемое согласие IESG. Документ дал право указать место внутри ресурса. Он не назначил пожизненного имени тому, что в этом месте стояло. Адрес квартиры не гарантирует, что жилец не переехал.