2011-01-07 32 views
0

输入文件取值从数据库更新输入文件中的列:通过在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; 
} 
+0

看起来你应该在每第四个字符后都换行符,不是吗?否则,你的代码不会让你想要什么 –

回答

1

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

+0

我认为问题是与文件处理。我可以在同一个文件上阅读和更新吗? –

+0

如果您想这样做,有两种方法:简单的方法是读取并使用整个文件,然后截断并放置新内容。不是太简单的方法是有一个字节数,并知道去哪里(重新)放置新的内容。我仍然认为你最好用Parse :: CSV之类的东西。它简单直接。 –

+2

Concure。只需使用Text :: CSV(我的首选CSV解析器),解析输入文件并在解析时用它打印一个** new **输出文件;然后在输入文件关闭后将新输出替换为旧输入文件。 – DVK

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()这三个参数表单(对于“怪异”文件名更安全),并使用词法文件句柄(它们不是全局的,当它们超出范围时,文件会自动关闭)。