我尝试使用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;
答案 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交互?
可能不。
以上代码可以简化为:
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;
当然,代码未经过测试。那么,下一步呢?