0

我尝试使用 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;
4

1 回答 1

4

想知道,您要寻找什么样的答案类型?但...

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

那太棒了。Perl 非常强大,适用于(几乎)任何任务。

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

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

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

其他

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

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

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

可能不是

  • quickbase 有一个用于访问的API,(您可以在此处了解它,并且每种语言(使用一些库)只是起到了桥梁作用。对于 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".
  • 而且,单元格内容也可能包含"字符,因此您需要对它们进行分隔。这里有更多的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;

当然,代码没有经过测试。那么,接下来呢?

于 2017-03-24T08:00:17.613 回答