使用perl脚本将数据从Quickbase导出和导入到csv文件

时间:2017-03-23 16:40:08

标签: perl quickbase

我尝试使用Perl语言与Quickbase进行交互,我使用下面的查询将数据表导出到文本文件中但是我没有得到正确的格式我想要,有什么想法吗?或者,如果有其他语言更容易与Quickbase交互?

@records = $qdb->doQuery($dbid,"{0.CT.''}","6.7.8.9"); 
$record_count = @records;

foreach $record (@records) {

  print MYFILE "|";

  foreach $field (keys %$record){
    if ($field eq "ColumnA") {
      print MYFILE "\"";
      print MYFILE " $field : $record->{$field}";
      print MYFILE "\"";   
    }

    if ($field eq "ColumnB") {
      print MYFILE "\"";
      print MYFILE "$field : $record->{$field}";
      print MYFILE "\"";
    }

    if ($field eq "ColumnC") {
      print MYFILE "\"";
      print MYFILE "$field : $record->{$field}";
      print MYFILE "\"";
    }

    if ($field eq "ColumnD") {
      print MYFILE "\"";
      print MYFILE "$field : $record->{$field}";
      print MYFILE "\"";
    }   
  }

  print MYFILE "\n";    
}

close LOGFILE;

1 个答案:

答案 0 :(得分:3)

想知道,你在找什么样的答案类型?但...

我尝试使用Perl语言与Quickbase进行交互,

那很好。 Perl非常强大,适用于(几乎)任何任务。

我使用以下查询将数据表导出到文本文件中

代码不是很简洁。它可能是来自Excel或BASIC人的遗留代码。一些评论:

  • 为每个字段执行相同操作的代码。那么,为什么你需要if statemenents?
  • 另外,为什么需要将每个print分成3个单独的print s?
  • 为什么你需要在行的开头|
  • 您可能希望关闭MYFILE而不是LOGFILE

其他

  • 打印到每个单元格field_name: field_value很奇怪,而不是创建列标题,而是YMMV - 所以也许你需要这个。
  • 最好使用词法文件句柄,例如$myfile而不是MYFILE
  • foreach可以写成for:)
但是我想要的格式不合适,有什么想法吗?

我无法说出您想要的格式,主要是因为:

  • 你没有说过你想要什么样的格式
  • ,不幸的是,我的水晶球正在进行定期维护。 :)
或者,如果有其他语言更容易与Quickbase交互?

可能

  • quickbase有一个API用于访问,(你can learn about it here,每种语言(使用一些库)只是桥接。对于perl,它是HTTP::QuickBase模块。你读过这份文件吗?
  • Perl非常强大,所以任何人都可以编写非常简洁的代码。只需要学习语言(和任何其他语言一样)。 (不幸的是,作为专家,我也更接近初学者。)

以上代码可以简化为:

for my $record ($qdb->doQuery($dbid,"{0.CT.''}","6.7.8.9")) {
    print MYFILE '|',
                 join('|', map {
                           '"' . $_ . ': ' . $_->{field} . '"'
                      } keys %$record
                  ), "\n";
}

并且完全如上所述。

但需要说明的是,这仍然是错误的解决方案。例如:

  • 需要应对引用,例如"cell content"
  • 但是,单元格内容也可以包含"字符,因此您需要espace它们。以下是CSV文件的更多转义技术,其中一个是引号字符加倍(通常为")。或者用\作为前缀。还有更多可能的问题,例如单元格中的“新行”字符\n等等。

为了避免CSV引用/逃避地狱和CSV生成的其他可能问题,您应该使用Text::CSV模块。它是在过去20年中开发出来的,因此它是一个非常长时间/硬/压力测试的模块。您可以将其用作:

use Text::CSV;
use autodie;

my $csv = Text::CSV->new ( { sep_char => '|', binary => 1 } ) #if you really want use the '|' instead of the standard comma.
               or die "Cannot use CSV: ".Text::CSV->error_diag ();
open $fh, '>', 'some.csv';
$csv->print( $fh, [map { $_->{field} } keys %$_]) for @$records;
close $fh;

当然,代码未经过测试。那么,下一步呢?