Потребовалось вывести статистику и проверить базу данных, родным Виндовс программы абсолютно не справлялись и даже не смогли найти запись из-за которой программа зависала. Пришлось немного освоить Perl XBase и написать небольшой bash скрипт
for t in *DBF; do
echo parse $t;
dbf_dump --info --SQL $t| \
sed s/boolean/tinyint/g | \
sed s/date/varchar/g | \
sed -r 's/numeric\(([0-9]+)\)/int(\1)/g' |\
mmysql AF3 && ./parse.pl $t |\
mmysql AF3 || \
echo error parse $t
done
- В скрипте с помощью dbf_dump для очереди DBF файлов генерируюется sql таблица
- затем с помощью sed приводит к виду понятному для mysql, затем вставляется в базу
- потом выбранный DBF файл обрабатывается Perl скриптом, который геренируется запросы вставки данных при этом обрабатывая их соотвествующим образом
- через конвеер данные вставляются в базу
А вот Perl скрипт для экспорта dbf to mysql
#!/usr/bin/perl
use Text::Iconv;
use XBase;
$conv = Text::Iconv->new('windows-1251','utf-8');
sub read_dbf{
my $table = new XBase $_[0] or die XBase->errstr;
$fields=join(", ",$table->field_names);
my $cursor = $table->prepare_select();
while (my @data = $cursor->fetch) {
@var=();
foreach $t (@data){
#$t = $conv->convert($r);
$t=~s/^\s+//g;
$t=~s/\r//g;
$t=~s/\n/\\n/g;
$t=~s/(\\n)+/\\n/g;
$t=~s/'/&\#039/g;
push @var, $t;
};
$var = join("', '",@var);
$name = $_[0];
$name =~ s!^.*/|\.dbf$!!ig;
$sql= $conv->convert("insert into $name ($fields) values('$var');");
print $sql,"\n"
}
}
while ( my $arg = shift @ARGV ) {
read_dbf($arg)
}