Типы данных Текстовый формат
Размер текстового поля может находиться в пределах от 1 до 255 символов.
Поле MEMO (Memo) может содержать текстовые данные длиной до 64000 символов. Но при этом информации обрабатывается намного медленнее.
Для текстового формата и поля Мемо используются в Microsoft Access существует два свойства полей, изменение которых приводит к похожим результатам: свойствоФормат поляи свойствоМаска ввода.
Формат поля используется в формах и запросах. Существует набор специальных символов формата, которые жестко задают вид и размер вводимых строк.
Кодовые символы формата текстовых полей представлены ниже:
@– должен быть обязательный текстовый символ или пробел;&– необязательный текстовый символ;<– преобразование символов в нижний регистр;>– преобразование символов в верхний регистр.
Формат поля может состоять из двух частей, разделенных знаком «точка с запятой». Первая часть является собственно форматом ввода, а вторая – определяет значение поля, если данные в него не были введены.
(символы отображаются синим цветом)
Пустое (Null) значение
Отображается введенный текст
Маска вводатакже представляет собой последовательность кодовых символов:
0 – должна быть цифра от 0 до 9;9— цифра или пробел;#– цифра, пробел, плюс или минус;L– должна быть буква (A. Z, А. Я);?– буква;А– должна быть буква или цифра;а– может быть буква или цифра;&– должен быть любой символ или пробел;С– произвольный символ;: ; — /– разделители, которые сохраняют свой вид в строке данных;<– преобразование символов в нижний регистр;> – преобразование символов в верхний регистр;!– маска должна заполняться справа налево;\– ввод следующего за обратной косой чертой символа как символьной константы.
Кодовые символы 0, А, L, & предполагают обязательный ввод данных в поле. Поскольку некоторые виды данных (даты, время, телефонные номера) содержат стандартные разделители, то для упрощения ввода предусмотрено, что некоторые общепринятые символы-разделители воспринимаются в маске ввода «буквально», то есть записываются в поле наряду с введенными данными. Кроме того, для определения символьных констант, состоящих из нескольких символов, допускается использовать двойные кавычки. В отличие от символов формата, символы маски ввода являются общими для всех типов полей, в которых разрешено применение маски.Пароль –создание поля для ввода пароля, вводимые символы не отображаются.
Примеры. В следующей таблице приводятся примеры часто используемых масок ввода и образцы значений, соответствующих этим маскам.
Маска ввода
Образцы значений
Подпись– это второй (первый – Имя) идентификатор поля, который используется программой вместо имени поля при работе с данными в табличной форме для создания заголовка столбца. Видимо, подпись полезна тем, что она может быть более информативной и естественной, чем имя поля.
Свойство «значение по умолчанию»говорит само за себя. Если при вводе данных часто повторяется одно и то же значение (в данном случае текстовая строка), то целесообразно «попросить» программу автоматически подставлять заданное значение во все вновь создаваемые поля. Пользователь же в процессе работы решает, оставить поле как есть или изменить данные. Это может сэкономить время при вводе, но может быть и причиной дополнительных ошибок, если оператор забудет стереть ненужные значения поля. С этим свойством связана процедураПостроитель выраженийдля облегчения формирования значения поля. Процедура вызывается нажатием кнопки, которая появляется после щелчка в строке «Значение по умолчанию».
Свойство «условие на значение»позволяет создать фильтр, который разрешит вводить в данное поле только то, что удовлетворяет определенному условию. Для задания такого критерия можно запуститьПостроитель выражений. Если же оператор БД нарушит условие ввода, то программа сообщит ему об этом, выведя на экран текст, определенный, каксвойство «сообщение об ошибке».
При задании условия на значение используются следующие операторы сравнения:
Меньше или равно
Больше или равно
Проверяет на равенство любому значению из списка; операндом является список, заключенный в круглые скобки
Проверяет, что значение поля находится в заданном диапазоне; верхняя и нижняя границы диапазона разделяются логическим оператором AND
Проверяет соответствие текстового или Мемо поля заданному шаблону символов
Примеры задания простых условий на значение для полей: Is Null Or >0 And <800– проверяет, является ли поле пустым(Is Null)или же введенное значение лежит в диапазоне от 0 до 800;>50 And <100илиBETWEEN 50 And 100 – данные два условия идентичны и проверяют числовое значение на попадание в интервал от 50 до 100;In («Белгород», «Москва», «Los Angeles»)– с помощью оператора IN можно выполнить множественное сравнение;#15.01.94#– если в качестве операнда используется дата, то она должна быть заключена в символы числа (#);LIKE «*товар##*»– данное условие используется для нахождения строк, содержащих подстрокутовари две произвольные цифры.
Свойство «обязательное поле»является логическим. Оно может принимать одно из двух значений:Да илиНет, которые выбираются из списка, связанного со строкой данного свойства.Даозначает, что в поле обязательно должны быть введены данные.
Свойство «пустые строки»тоже логическое и похоже на предыдущее. Оно определяет, разрешены или нет в данном поле пустые строки. Для Access существуют два разных понятия: «поле, в которое ничего не было введено» и «поле с пустой строкой, то есть содержащее пробелы». Реляционные базы данных обеспечивают возможность хранения в полях таблиц специального значенияNull, называемогопустым значением, которое обозначает некоторое неизвестное значение. Пустое значение имеет особые свойства. Так, пустое значение не может быть равно никакому другому значению, в том числе другому пустому значению. Это означает, что нельзя объединить (связать) две таблицы по значению Null. Условие «А = В», где А или В содержит Null, всегда будет ложным. Наконец, пустые значения не учитываются витоговых функциях, таких какSum (Сумма)илиAvg (Среднее значение). Вы можете лишь проверить наличие значения Null, сравнив значения поля со специальной константой NULL или используя встроенную функциюIsNull. С другой стороны, вы можете установить значение текстового или Мемо поля равнымпустой строке («»), и это будет означать, что значение поля известно, но поле пустое. Вы можете соединять таблицы по пустым строкам. При сравнении пустые строки считаются равными друг другу. Чтобы разрешить пользователю ввод пустых строк в текстовые и Мемо поля, вам следует установить для свойстваПустые строки значениеДа. Если вы этого не сделаете, Access преобразует введенные пользователем пустые строки, а также строки, состоящие из пробелов, в строки, содержащие значение Null. Если при этом свойствоОбязательное поле для текстового поля установлено какДа, то Access сохраняет пустую строку в качестве значения, когда пользователь вводит «» или строку, состоящую только из пробелов.
Свойство «индексированное поле» может иметь одно из трех значений: или поле не индексировано, или индексировано, но допускаются повторяющиеся значения, или индексировано, и повторения значений поля запрещены.
Разумеется, при конструировании базы данных нет необходимости задавать все свойства полей. Но, чтобы полностью использовать потенциал Access, вы должны при работе с программой держать «в уме» возможность применения того или иного свойства.
Свойство «сжатие Юникод». В Microsoft Access 2000 для хранения информации полей типа «Текстовый», «Поле MEMO» и «Гиперссылка» используется кодировка Юникод (Unicode). В Юникод каждый символ представляется двумя байтами, а не одним, как в традиционных кодировках. В результате для хранения данных полей типа «Текстовый», «Поле MEMO» и «Гиперссылка» требуется больше места, чем в предыдущих версиях Access.
Этот эффект использования кодировки Юникод можно сгладить, установив свойство Сжатие Юникод (Unicode Compression) поля в значение Да. При создании полей типа «Текстовый», «Поле MEMO» и «Гиперссылка» это значение свойства устанавливается по умолчанию. Когда свойствоСжатие Юникодполя имеет значениеДа, все символы, первый байт которых равен 0, будут сжиматься при сохранении и восстанавливаться при выборке. Если первый байт отдельного символа не равен нулю, этот символ не будет сжиматься.
Поле мемо в Access: как его создать и использовать
В программе Microsoft Access есть много разных типов полей, однако между ними есть некоторые ключевые различия. Одним из таких типов полей является поле мемо. В отличие от обычного текстового поля, поле мемо позволяет хранить и отображать большие объемы текста, в том числе на нескольких строках.
Создание многострочного текстового поля в Access довольно просто. Сначала откройте базу данных или создайте новую. Затем выберите табличную структуру и нажмите на кнопку «Создать поле». В появившемся окне выберите тип поля «Мемо».
После выбора типа поля «Мемо» вы можете задать его имя, а также другие параметры, такие как ограничение размера или форматирование текста. Завершив настройку, нажмите кнопку «Готово». Таким образом, вы создали многострочное текстовое поле в базе данных Access.
Использование поля мемо может быть полезным во многих случаях. Например, вы можете использовать его для хранения длинных комментариев или описаний, заметок или примечаний к определенным записям. Благодаря своей многострочности, поле мемо позволяет более гибко организовывать информацию и делать более полное описание объектов.
В заключение, поле мемо в программе Access предоставляет возможность создания и использования многострочного текстового поля. Оно удобно для хранения и отображения больших объемов текста, что делает его полезным инструментом при работе с базами данных. Создать такое поле в Access достаточно просто и требует всего лишь нескольких шагов.
Многострочное текстовое поле в Access
При создании базы данных в Access, часто требуется включить поле для ввода длинных текстовых данных. Для этой цели можно использовать многострочное текстовое поле, которое позволяет пользователю вводить тексты, включающие несколько строк.
Для создания многострочного текстового поля в Access необходимо выполнить следующие шаги:
- Откройте таблицу, в которую хотите добавить многострочное текстовое поле, в режиме «Показать таблицу».
- Выберите ячку, в которой хотите разместить многострочное текстовое поле.
- На верхней панели инструментов выберите вкладку «Поле» и нажмите на кнопку «Текст».
- В появившемся меню выберите опцию «Текст с переносами», чтобы создать многострочное поле.
Теперь в выбранной ячейке в таблице появится многострочное текстовое поле, в которое можно вводить данные.
Когда вы переходите на доступ к данным в основном режиме, в этом поле будет отображаться только первая строка введенного текста. Однако, вы можете открыть поле для редактирования и просмотра остальных строк введенного текста, щелкнув по нему и нажав клавишу Enter.
Многострочные текстовые поля в Access особенно полезны при хранении и отображении больших объемов текстовой информации, таких как заметки, описания или комментарии.
Кроме того, в многострочных текстовых полях можно применять форматирование текста, такое как выделение жирным, курсивом или подчеркивание, а также использовать списки и таблицы.
Примеры форматирования текста в многострочном поле
- Первый элемент списка
- Второй элемент списка
- Третий элемент списка
В итоге, многострочное текстовое поле в Access позволяет легко вводить и форматировать длинные тексты, облегчая работу с базой данных и улучшая качество хранения информации.
Как создать поле мемо в Access:
Поле мемо в Access представляет собой особый тип поля, который позволяет хранить многострочные текстовые данные. Создание поля мемо в Access позволяет пользователям вводить и хранить более длинные текстовые значения, чем строковые поля.
Для создания поля мемо в Access следуйте этим шагам:
- Откройте свою базу данных Access и выберите таблицу, в которой вы хотите создать поле мемо.
- Выберите поле, перед которым вы хотите добавить поле мемо, или создайте новое поле, если оно еще не существует.
- Щелкните правой кнопкой мыши в ячейке заголовка выбранного поля и выберите «Изменить» или дважды щелкните на ячейке заголовка, чтобы войти в режим редактирования.
- Введите желаемое имя поля, которое будет отображаться в таблице.
- Нажмите клавишу Tab, чтобы перейти к следующему полю.
- В открывшемся меню перейдите на вкладку «Типы данных» и выберите «Мемо».
- Нажмите кнопку «ОК» для сохранения изменения.
Поле мемо в Access теперь создано и готово к использованию. Вы можете вводить и хранить многострочные текстовые данные в этом поле, а также выполнять различные операции с ними, такие как поиск, сортировка и фильтрация.
Примечание: если вы уже имеете данные в таблице, поля типа мемо могут использоваться только для новых записей. Существующие данные в других типах полей не могут быть просто преобразованы в поле мемо, поэтому имейте это в виду при создании и настройке полей мемо в Access.
Преимущества многострочного текстового поля
Многострочное текстовое поле является одним из основных элементов форм в базах данных, включая Microsoft Access. Оно предоставляет возможность вводить и хранить большой объем текста.
Вот некоторые преимущества использования многострочного текстового поля:
- Ввод и хранение большого объема текста: Многострочное текстовое поле позволяет вводить и хранить до 65,535 символов. Это дает пользователю возможность вводить подробную информацию или комментарии.
- Форматирование текста: Многострочное текстовое поле позволяет использовать различные элементы форматирования, такие как жирный текст (strong), курсив (em), списки (
-
и
-
), и т.д. Это повышает удобство использования и улучшает читаемость текста.
- Редактирование текста: Многострочное текстовое поле обеспечивает возможность редактирования текста прямо в поле. В отличие от однострочного текстового поля, где текст усекается, если не помещается в видимой области, многострочное текстовое поле автоматически добавляет полосы прокрутки, что позволяет пользователям просматривать и редактировать весь текст.
- Сортировка и фильтрация: Многострочное текстовое поле позволяет сортировать и фильтровать данные по содержимому поля. Таким образом, пользователи могут быстро находить нужную информацию и анализировать данные по различным критериям.
- Вывод данных в отчетах и формах: Многострочное текстовое поле может быть использовано для вывода данных в отчетах и формах. В отличие от однострочного текстового поля, многострочное текстовое поле способно отображать весь текст, что позволяет более полно представлять информацию в пользовательском интерфейсе.
В целом, многострочное текстовое поле является полезным инструментом при работе с большим объемом текстовой информации в базе данных, и его использование может значительно упростить ввод, хранение и отображение текста.
Использование многострочного текстового поля
Многострочное текстовое поле в Access позволяет вводить и хранить более одной строки текста. Это полезно, когда вам нужно ввести или отобразить большой объем текста, такой как комментарии, описания или заметки.
Для создания многострочного текстового поля в Access, выполните следующие действия:
- Откройте базу данных в программе Access.
- Перейдите на вкладку «Создание» в верхней части экрана.
- Выберите «Таблица» в разделе «Таблицы» и нажмите на кнопку «Ок».
- Добавьте необходимые поля в таблицу, а затем выберите поле, в котором вы хотите создать многострочное текстовое поле.
- Перейдите на вкладку «Размер поля» и выберите «Многострочное» в выпадающем меню «Вид поля».
- Нажмите на кнопку «Ок».
- Теперь вы можете вводить и отображать несколько строк текста в этом поле.
Многострочное текстовое поле также может быть использовано при создании форм и отчетов в Access. Для этого перейдите в режимы «Формы» или «Отчеты» и добавьте это поле на нужную форму или отчет, используя инструменты на панели инструментов или перетаскивая поле из таблицы.
Чтобы использовать многострочное текстовое поле в программе Access, вы можете использовать различные функции и операции для работы с данными в поле. Например, вы можете выполнять поиск, фильтрацию, сортировку и другие операции для работы с содержимым многострочного текстового поля.
Использование многострочного текстового поля в Access предоставляет удобный способ ввода и хранения большого объема текста. Благодаря этому функционалу вы можете эффективно управлять и анализировать данные в базе данных.
Вопрос-ответ
Как создать поле мемо в Access?
Для создания многострочного текстового поля в Access нужно выбрать таблицу, в которой вы хотите добавить такое поле. Затем перейдите в режим проектирования таблицы и выберите тип данных «Memo» для нового поля. После этого вы сможете вводить и хранить текст любой длины в этом поле.
Как изменить размер многострочного текстового поля в Access?
Для изменения размера многострочного текстового поля в Access нужно перейти в режим проектирования таблицы и щелкнуть на поле мемо, которое вы хотите изменить. Затем вы можете изменить ширину и высоту поля, увеличивая или уменьшая его размеры.
Как изменить максимальное количество символов в многострочном текстовом поле в Access?
В Access максимальное количество символов в многострочном текстовом поле определяется типом данных «Memo». Такие поля не имеют ограничения на количество символов, поэтому вы можете вводить и хранить текст любой длины.
Можно ли добавлять форматирование текста в многострочное текстовое поле в Access?
В многострочном текстовом поле в Access можно добавлять форматирование текста, используя специальные символы. Например, вы можете использовать символы для новой строки, перевода страницы, жирного, курсивного или подчеркнутого текста. Это позволяет вам создавать более структурированный и читаемый текст в поле мемо.
Можно ли использовать многострочное текстовое поле в Access для хранения больших объемов текста?
Да, многострочное текстовое поле в Access идеально подходит для хранения больших объемов текста. Тип данных «Memo» не имеет ограничения на количество символов, поэтому вы можете вводить и хранить текст любой длины. Это быстро и эффективно, особенно если вам нужно хранить большие объемы текста, такие как заметки или комментарии.
В чем особенность поля мемо
Каждая таблица в Access состоит из полей. В свойствах поля описываются характеристики и поведение добавляемых в него данных. Тип данных поля — это самое важное свойство, которое определяет, какие данные могут храниться в поле. В этой статье описаны типы данных и другие свойства поля, доступные в Access, а также приведена дополнительная информация в разделе справочных сведений о типах данных.
В этой статье
Общие сведения
Иногда типы данных могут показаться неочевидными, например в поле с типом данных «Текст» могут храниться данные, состоящие из текста и чисел. Но в поле с типом данных «Число» могут храниться только числовые данные. Поэтому вам нужно знать, какие свойства используются для каждого типа данных.
Тип данных поля определяет много других важных характеристик поля, в частности:
форматы, которые можно использовать в поле;
максимальный размер значения в поле;
способ использования поля в выражениях;
возможность индексирования поля.
В зависимости от способа создания нового поля тип данных поля может быть задан заранее или его можно выбрать. Например, если при создании поля в режиме таблицы вы:
используете существующее поле из другой таблицы, типы данных уже определены в ней или в шаблоне;
вводите данные в пустом столбце (или поле), Access назначает полю тип данных, исходя из вводимых значений, или вы можете назначить тип данных и формат для поля;
на вкладке Изменение полей в группе Поля и столбцы выбираете команду Добавить поля, Access отображает список типов данных для выбора.
Когда какой тип данных использовать?
Тип данных поля можно посметь набором характеристик, которые применяются ко всем значениям в нем. Например, значения, хранимые в текстовом поле, могут содержать только буквы, цифры и ограниченный набор знаков препинания, а текстовое поле может содержать не более 255 символов.
Совет: Иногда все выглядит так, как будто данные в поле имеют один тип, а на самом деле это данные другого типа. Например, поле вроде бы содержит числовые значения, но на самом деле это текстовые значения, представляющие номера комнат. Часто для сравнения или преобразования значений с разными типами данных используются выражения.
В таблицах ниже показаны форматы, доступные для каждого типа данных, и описаны результаты форматирования.
Основные типы
Отображаемые данные
Короткие буквенно-цифровые значения, например фамилия или почтовый адрес. Помните, что начиная с версии Access 2013, текстовый тип данных переименован в Краткий текст.
Числовой, Большое число
Числовые значения, например расстояния. Помните, что для денежных значений есть отдельный тип данных.
Значения «Да» и «Нет», а также поля, содержащие только одно из двух значений.
Date/Time, Date/Time Extended
Дата и время: значения даты и времени для лет от 100 до 9999.
Date/Time Extended: значения даты и времени для лет с 1 по 9999.
Форматированный текст
Текст или сочетание текста и чисел, которые отформатированы с помощью элементов управления цветом и шрифтом.
Вычисляемое поле
Результаты вычисления. Вычисление может ссылаться на другие поля в той же таблице. Вычисления создаются с помощью построителя выражений. Вычисляемые поля впервые появились в Access 2010.
Вложенные изображения, файлы электронных таблиц, документы, диаграммы и другие файлы поддерживаемых типов в записях базы данных (как и в сообщениях электронной почты).
Гиперссылка
Текст или сочетание текста и чисел, сохраненное как текст и используемое в качестве адреса гиперссылки.
Длинные блоки текста. Типичный пример использования поля MEMO — подробное описание продукта. Помните, что начиная с версии Access 2013, тип данных MEMO переименован в «Длинный текст».
Подстановка
Список значений, которые получены из таблицы или запроса, или набор значений, которые вы указали при создании поля. Запускается мастер подстановок, с помощью которого можно создать поле подстановки. В зависимости от выбора, сделанного в мастере, данные в поле подстановки могут иметь текстовый или числовой тип.
У полей подстановки есть дополнительный набор свойств, которые находятся на вкладке Подстановка в области Свойства поля.
Примечание: В файлах формата MDB недоступны вложения и вычисляемые данные.
Числовой
Отображаемые данные
Числа без дополнительного форматирования (точно в том виде, в котором хранятся).
Обычные денежные значения.
Обычные денежные значения в формате ЕС.
Фиксированный
Стандартный
Числовые данные с десятичными знаками.
Значения в процентах.
Экспоненциальный
Дата и время
Отображаемые данные
Краткий формат даты
Дата в кратком формате. Зависит от региональных параметров даты и времени. Например, 14.03.2001 для России.
Средний формат даты
Дата в среднем формате. Например, 03-апр-09 для России.
Длинный формат даты
Дата в длинном формате. Зависит от региональных параметров даты и времени. Например, 14 марта 2001 г. для России.
Время (12 часов)
Время только в 12-часовом формате, который будет соответствовать изменениям в региональных параметрах даты и времени.
Средний формат времени
Время в 12-часовом формате, после которого указываются символы AM (до полудня) или PM (после полудня).
Время (24 часа)
Время только в 24-часовом формате, который будет соответствовать изменениям в региональных параметрах даты и времени.
Логический
Отображаемые данные
«Истина» или «Ложь».
Включено/Выключено
Объект OLE Объекты OLE, например документы Word.
Свойство «Размер поля»
После создания поля и указания типа данных для него можно настроить дополнительные свойства поля. Набор доступных дополнительных свойств зависит от типа данных поля. Например, вы можете настроить размер текстового поля с помощью свойства Размер поля.
Для числовых и денежных полей свойство Размер поля особенно важно, поскольку определяет диапазон значений поля. Например, одноразрядное числовое поле может содержать только целые числа в диапазоне от 0 до 255.
Свойство Размер поля определяет также, сколько места на диске занимает каждое значение числового поля. В зависимости от размера поля число может занимать 1, 2, 4, 8, 12 или 16 байт.
Примечание: В полях MEMO и текстовых полях возможны значения переменных размеров. Для этих типов данных свойство Размер поля задает максимальный размер доступного пространства для одного значения.
Дополнительные сведения о свойствах полей и той роли, которую они выполняют для различных типов данных, см. в разделе Справочные сведения о типах данных. Ознакомьтесь также со статьей Задание размера поля.
Типы данных в связях и соединениях
Связь между таблицами — это связи между общими полями в двух таблицах. Связь может быть одного из следующих типов: один к одному, один ко многим, многие ко многим.
Объединение — это операция SQL, которая объединяет данные из двух источников в одну запись в запросе набор записей на основе значений в указанном поле, которые имеются в общих источниках. Присоединиться может быть внутреннее соединение, левое внешнее соединение или правое внешнее соединение.
Когда вы создаете связь между таблицами или добавляете соединение в запрос, типы данных в соединяемых полях должны быть одинаковые или совместимые. Например, вы не сможете создать соединение между числовым и текстовым полями, даже если значения в этих полях совпадают.
При использовании связи или соединения поля с типом данных «Счетчик» совместимы с полями числового типа, если для свойства Размер поля последних задано значение Длинное целое.
Для поля, участвующего в связи между таблицами, нельзя изменить тип данных или свойство Размер поля. Чтобы изменить свойство Размер поля, временно удалите связь. Но после изменения типа данных вы не сможете снова создать связь, пока не измените тип данных связанного поля. Дополнительные сведения о таблицах см. в статье Общие сведения о таблицах.
Справочные сведения о типах данных
Тип данных, применяемый к полю, содержит набор свойств, которые вы можете выбрать. Чтобы получить дополнительные сведения, щелкните типы данных ниже.
Реинкарнация данных II: memo-поля
В прошлом номере журнала (см. №4 за 2005 г.) мы рассмотрели несколько способов переноса данных из таблиц формата DBF в PostgreSQL. Однако чтобы не перегружать статью, вопрос работы с полями типа memo, достаточно широко используемыми в FoxPro, был оставлен без внимания. Теперь пришло время восполнить данный пробел.
Если нужно сохранить в одном поле данные большого или неопределенного объема, в FoxPro (как и в некоторых других СУБД) используются поля специального типа – так называемые memo-поля. Данные такого поля физически сохраняются в отдельном файле (в случае с FoxPro он имеет то же имя, что и dbf-файл, но с расширением fpt). Логически мемо-поля связываются с таблицей таким образом, что доступны, как и любое другое поле текущей записи.
Файл fpt для упрощения работы с данными хранит их поблочно. Размер блока по умолчанию в FPD 2.6 составляет 64 байта. Заголовок fpt-файла имеет размер 512 байт, структура его следующая:
Таблица. Структура заголовка fpt-файла
Номер следующего свободного блока
Начиная с 513-го байта от начала файла, располагаются блоки данных. Значение поля может занимать один или несколько блоков. Каждый блок, являющийся первым для записи, содержит 8-байтный заголовок (4 байта сигнатура 0х00000001 и 4 байта – длина поля), после которого следуют собственно данные.
Для обеспечения связи таблицы с данными в fpt-файле в каждой записи dbf-файла memo-полю отводится 10 байт, в которые заносится номер первого блока данных. Причем номер хранится в символьном виде с ведущими пробелами. Например, для указания на блок 8 данное поле будет содержать значение « 8» (в шестнадцатеричном виде «20 20 20 20 20 20 20 20 20 38», где 38 – ASCII-код символа «8»). Нумерация блоков идет от начала файла, то есть включает и заголовок.
Например, при стандартной длине блока 64 байта записи данных будут начинаться с блока 8 (длина заголовка 512, деленная на размер блока 64).
С чем предстоит бороться
Теоретически формат DBF позволяет хранить в поле типа memo до 4 Гб данных. Однако на практике из-за внутренних ограничений FoxPro на длину строки оперировать с полями свыше 65504 символов становится проблематично. На практике длина этого поля редко превышает несколько тысяч символов. Поэтому вполне допустимо полагать, что данные из поля типа memo могут быть размещены в поле типа text таблицы PostgreSQL (максимальное значение поля – 1 Гб). Так что размеры полей проблемой считать не будем.
Сложнее то, что memo-поля могут содержать разнообразные символы, включая символ перевода строки. Поскольку при обработке текстового файла PostgreSQL воспринимает этот символ как разделитель записей, то необходимо позаботиться об его экранировании. Причем в случае формата конца строки в стиле DOS (CR+LF) экранировать нужно как символ перевода строки (0x0D), так и символ возврата каретки (0x0A).
Можно использовать формат CSV для загрузки в PostgreSQL – в этом случае значением поля будут считаться все символы, заключенные в «кавычки». «Кавычками» в данном случае может выступать любой символ, он задается как параметр команды COPY. Теперь внутри поля нужно экранировать «кавычки» (путем удвоения), однако в данном случае больше шансов найти подходящий символ, мало используемый внутри поля данных. К тому же исключаются проблемы с различными стилями перевода строки.
Реализация на FoxPro
FoxPro работает с memo-полями прозрачно, так что никаких усилий со стороны программиста не требуется. Не забудьте поставить символ «» перед символами-разделителями:
Листинг 1. Файл memo2pg.prg (FoxPro)
* Это – комментарий с начала строки
&& А так выделяются комментарии в произвольном месте строки
use wmem && Открываем таблицу с memo-полями
m.delimiter = chr(9) && символ Tab
* Текстовое поле – экранируем разделители и символ «\»
m.descr = strtran(m.descr, m.delimiter, ;
* В memo-поле дополнительно экранируем символы конца строки (ASCII-коды 10 и 13)
m.memfld = strtran(m.memfld, m.delimiter, ;
m.memfld = strtran(m.memfld, chr(13), ;
m.memfld = strtran(m.memfld, chr(10), ;
* Записываем результат в файл, разделяя поля символом, хранящимся в переменной m.delimiter
wait window ‘Finished.’
Рисунок. Рабочее окно FoxPro
Если вы решите работать с CSV-форматом, то вместо табуляции в качестве разделителя будет использоваться запятая, а каждое поле данных, независимо от типа, нужно будет окружить символом-«кавычкой», например «”», который используется по умолчанию. Ну и внутри полей все «кавычки» должны быть удвоены, чтобы исключить их специальную интерпретацию.
Реализация на Python
А вот здесь нам придется применить все накопленные выше знания по формату файлов DBF и FPT. Поскольку полностью сценарий разбора DBF-файла приводился в прошлой статье, здесь ограничимся только той частью, которая отвечает за получение данных из мемо-поля. За основу взят сценарий dbf2pg.py, рассмотренный в предыдущей статье (см. листинг 2). В него добавлена обработка полей типа «M» в цикл, обрабатывающий каждую запись (соответствующие строки выделены красным шрифтом):
Листинг 2. Фрагмент сценария dbf2pg.py, добавленные строки
for i in range(num):
if fields[i].type == ‘M’:
if fields[i].type == ‘D’:
fld = fld[:4] + ‘-‘ + fld[4:6] + ‘-‘ + fld[6:]
Здесь при обнаружении поля типа memo считанное значение трактуется как содержащее номер первого блока данных, и вызывается функция разбора fpt-файла:
Листинг 3. Фрагмент сценария dbf2pg.py, функция memo2pg
# Номер блока преобразуем в число
fpt = open(basetabname + ‘.fpt’, ‘rb’)
# Считываем размер блока
blocksize = int(ord(fpt.read(1)) * 256 + ord(fpt.read(1)))
# Смещаемся к началу блока данных
# Считываем размер поля данных
fieldsize = ord(fpt.read(1)) * 16777216 + ord(fpt.read(1)) * 65536 + ord(fpt.read(1)) * 256 + ord(fpt.read(1))
# Перекодировка, экранирование и проч.
data = unicode(data, ‘cp866’).encode(‘koi8-r’)
data = data.replace(‘\x0A’, ‘\\’ + ‘\x0A’)
data = data.replace(‘\x0D’, ‘\\’ + ‘\x0D’)
data = data.replace(delimiter, ‘\\’ + delimiter)
Наконец, нужно позаботиться, чтобы Python не обрабатывал символы перевода строки самостоятельно, для чего вместо вывода каждой сформированной строки с помощью оператора print мы будем осуществлять запись в файл, открытый в двоичном режиме, и формировать конец строки вручную так, как нам нужно:
Листинг 4. Фрагмент сценария dbf2pg.py, запись строки в файл
В результате dbf2pg.py теперь может обрабатывать и memo-поля.
Язык FoxPro предоставляет развитые средства для работы со своими файлами (выглядело бы странно, если бы это было не так), и осуществить конвертирование файла DBF в другой формат c его помощью – дело нескольких строк кода. Однако не беда, если вы не очень дружны с ним или не можете им воспользоваться по каким-то причинам. Двоичный формат DBF, как вы могли убедиться, достаточно прост и удобен. Так что при необходимости реализовать его обработку имеющимися подручными средствами труда не составит.