通过从perl中的数据库获取值来更新输入文件中的列

时间:2011-01-07 15:49:06

标签: perl

输入文件:

1,a,USA,,
2,b,UK,,
3,c,USA,,

我想更新输入文件中的第4列,从其中一个表中获取值。

我的代码如下:

my $number_dbh = DBI->connect("DBI:Oracle:$INST", $USER, $PASS ) or die "Couldn't
connect to datbase $INST";
my $num_smh;
print "connected \n ";
open FILE , "+>>$input_file" or die "can't open the input file";
print "echo \n";
while(my $line=<FILE>)
{
   my @line_a=split(/\,/,$line);
   $num_smh = $number_dbh->prepare("SELECT phone_no from book where number = $line_a[0]");
   $num_smh->execute() or die "Couldn't execute stmt, error : $DBI::errstr";
   my $number = $num_smh->fetchrow_array();
   $line_a[3]=$number;
}

2 个答案:

答案 0 :(得分:1)

您的数据看起来像是CSV格式。您可能想要使用Parse::CSV

答案 1 :(得分:0)

+>>没有按照您的想法行事。事实上,在测试中它似乎根本没有做任何事情。此外,+<做了一件非常奇怪的事情:

 % cat file.txt
1,a,USA,,
2,b,UK,,
3,c,USA,,
 % cat update.pl
#!perl

use strict;
use warnings;

open my $fh, '+<', 'file.txt' or die "$!";
while ( my $line = <$fh> ) {
    $line .= "hello\n";
    print $fh $line;
}
 % perl update.pl
 % cat file.txt
1,a,USA,,
1,a,USA,,
hello
,,
,,
hello
 %

+>似乎会截断文件。

实际上,您要做的是写入新文件,然后将该文件复制到旧文件上。打开同时读/写的文件看起来就像是在进入一个受伤的世界。

顺便说一句,你应该使用open()的三参数形式(对于“奇怪的”文件名更安全)并使用词法文件句柄(它们不是全局的,当它们自动超出范围时你的文件为你关闭)。