【问题标题】:How to save each row of a database as a seperate data block file in a directory using perl?如何使用perl将数据库的每一行保存为目录中的单独数据块文件?
【发布时间】:2012-06-18 18:46:48
【问题描述】:

现在,我有一个大约 20 列和 70 行的数据库。我想遍历每一行并将每一行保存为一个单独的数据块,文件名由前三列生成。我已经有 SQL 代码选择我想要的特定列并根据我想要的参数对其进行排序。我要文件的目录在c:/database/first_past

在我的代码中,$ds 是一个变量,它是一个哈希数组,即我当前的数据库。我有两个循环遍历数据库并进入行,但我不确定要插入的行以将行保存为上面提到的目录中自己的单独文件,并带有特定的标题参数。

这在 Perl 中可行吗?这是我目前使用的部分代码:

for my $rec (@{$ds->{DATA}}) {
    for my $role (keys %{$rec} } {
        #here is the save file line? ("$role=$rec->{$role}"
    }
}

$ds 是一个哈希数组,DATA 字段是一行的所有数据。

【问题讨论】:

  • 什么样的数据库? PostgreSQL? MySQL? MongoDB?
  • 哎呀,对不起,我从来没有把它包括在内。 Oracle 数据库。
  • 您为什么不向我们展示代码以便我们为您提供帮助?这当然是可能的。还要显示文件应该是什么样子。
  • 我发布了代码。整个文件只是假设看起来像一个代码块。只需用逗号分隔的每一行的文本。

标签: database arrays perl hash


【解决方案1】:
use DBI qw( );

my $dbh = DBI->connect($dsn, $user, $passwd, {
   RaiseError       => 1,
   PrintError       => 0,
   PrintWarn        => 1,
   AutoCommit       => 1,
   FetchHashKeyName => 'NAME_lc',
});

my $sth = $dbh->prepare('
    SELECT *
      FROM Table
     ORDER BY ...
');

$sth->execute();
while (my $row = $sth->fetch()) {
    my $fn = join('-', @{$row}[0,1,2]);
    my $qfn = "c:\\database\\first_past\\" . $fn;
    open(my $fh, '>', $qfn) or die $!;
    print($fh ...);
}

DBIopenprint


关于您的后续问题:

$sth->execute();
while (my $row = $sth->fetch()) {
    my $fn = join('-', @{$row}[0,1,2]);
    my $qfn = "c:\\database\\first_past\\" . $fn;
    open(my $fh, '>>', $qfn) or die $!;
    print($fh ...);
}

my $last_fn;
my $fh;
$sth->execute();
while (my $row = $sth->fetch()) {
    my $fn = join('-', @{$row}[0,1,2]);
    if (!defined($last_fn) || $last_fn ne $fn) {
        $last_fn = $fn;
        my $qfn = "c:\\database\\first_past\\" . $fn;
        open($fh, '>', $qfn) or die $!;
    }

    print($fh ...);
}

【讨论】:

  • fetchrow_hashref 可以用来代替 fetch 如果您想按名称而不是按位置访问字段。
  • 我会建议Text::CSV,但这当然是最快的方法。
  • @simbabque,您的意思是使用其他工具执行查询并将结果转储到 CSV 文件,然后让脚本通过 CSV 读取?好吧,我可以看到这样做是出于性能原因,但我们谈论的是 70 行。
  • 什么是70,000行的数据库?那么哪种方式最快?
  • 最简单的更改:>>>。但是您也可以将句柄移到循环外,并将第一列保存在循环外的变量中,以便检查是否有变化。代码添加到答案的底部。
猜你喜欢
  • 2014-01-23
  • 2012-04-10
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多