Пакетная обработка DBF Foxpro файлов

Потребовалось вывести статистику и проверить базу данных, родным Виндовс программы абсолютно не справлялись и даже не смогли найти запись из-за которой программа зависала. Пришлось немного освоить 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
  1. В скрипте с помощью dbf_dump для очереди DBF файлов генерируюется sql таблица
  2. затем с помощью sed приводит к виду понятному для mysql, затем вставляется в базу
  3. потом выбранный DBF файл обрабатывается Perl скриптом, который геренируется запросы вставки данных при этом обрабатывая их соотвествующим образом
  4. через конвеер данные вставляются в базу

А вот 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)
}

 

#!/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($ar

похожие страницы

  1. Пакетная обработка DBF Foxpro файлов, Import в FoxPRO
  2. Автоматическая обработка файлов, часть два
  3. Автоматическая обработка файлов на хостинге с помощью bash
  4. Пакетная обработка фотографий, обрезка, изменение размера и конвертирование группы изображений
  5. Обработка Excel файлов в командной строке

#1:  Басманов:

for t in *DBF; do
echo $t | awk -F. '{print "truncate "$1}' |mmysql AF3
~/bin/parse.pl $t | mmysql AF3 || echo error parse $t
done

ответить  2010-03-30 08:52:25 

#2:  Басманов:

ERROR 1136 (21S01) at line 4: Column count doesn't match value count at row 1
error parse MOVE.DBF

ответить  2010-03-30 08:52:47