2011-01-07 33 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()這三個參數表單(對於「怪異」文件名更安全),並使用詞法文件句柄(它們不是全局的,當它們超出範圍時,文件會自動關閉)。