DBF → text
Попросили сконвертировать кучу досовских файлов формата DBF (dBase) во что-нибудь путное. Вдруг кому-то ещё понадобится, публикую решение. Для того, чтобы достать информацию из файлов, воспользовался утилитой pgdbf, просто потому что она есть в «Брю» для «Мака» и небольшим скриптом, чтобы пакетно всё обработать, обрубая всё лишнее:
#!/bin/bash
[ -e converted ] || mkdir converted
# ищем все файлы dbf
find . -iname '*.dbf' | while read name; do
echo "$name"
# файл куда будет выгружен результат
outname=converted/$(tr / '_' <<< "${name/./}").txt
# есть ли файл memo?
memo=${name%.*}.DBT
if [ -e "$memo" ]; then
# не добавлять удаление таблицы, кодировка CP866
pgdbf -D -s cp866 -m "$memo" "$name"
else
pgdbf -D -s cp866 "$name"
fi |
grep -vE '^(BEGIN|\\COPY|\\\.|COMMIT)' |
(
# ↑↑↑ срезаем лишнее от утилиты pgsql
read header
# CREATE TABLE преобразуем в заголовок
if [[ "$header" == 'CREATE TABLE'* ]]; then
grep -o "(.*)" <<< "$header" |
sed -e 's/ [^ ,]*,//g;s/ [^ ]*$//;s/(//' | tr ' ' '\t'
else
echo "$header"
fi
# остальное — без измненений
cat
) > "$outname"
done