2014-05-09 68 views
0

我有一个仅包含一行的.csv文件。假设文件名是new.csv并在该行> ABC,加,爱尔兰,adfw,航空自卫队Perl - 读取文件并将数据追加到已存在的行

现在我试图读取该文件,然后试图追加另一个数据是通过书面形式向像这样的文件。

open(FH , '+<' , "") or die "Cannot open the file : $!" 
while(<FH>){ 
    chomp($_); 
    print FH ", new_data"; 
} 
close(FH) 

通过运行此

预期输出:

ABC,加,爱尔兰,adfw,航空自卫队,NEW_DATA

实际输出:

ABC ,add,aer,adfw,asdf new_data

即使我在$ _上使用chomp,新数据也被添加到新行中。

其他的事情我已经试过了是

  1. 我试着写一个全新的文件,然后使用系统()函数与旧更换新的文件。

  2. 我试过使用连接函数和字符串连接函数。

  3. 我试着将行发送给一个新的变量,然后附加数据,然后写入文件。

所有这些都失败了。

感谢您的帮助。

赛帕Yaraguti

回答

0
即使我使用的格格在$ _

在你的情况,$_是当前输入行的内存副本,所以chomp不会改变输入文件的相应行。

更改文件的一种方法是使用Tie::File,它将常规文件绑定到数组,因此您可以通过更改该数组来修改该文件。

下面是一个例子:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tie::File; 

my $file = 'new.csv'; 

tie my @line, 'Tie::File', "$file" or die "Cannot tie $file: $!"; 

$line[0] .= ', new_data'; 

untie @line; 
2

一般来说最好是写你的输出到一个新的文件,因为有许多问题与阅读和写入一次相同的文件。

但是,在包含单行文本的文件的情况下,可以相对安全地完成。

这个程序显示了这个想法。seek的调用是将指针移回到文件的开头,否则它将在文本行结束后指向左侧,这就是为什么你自己的尝试离开了行后面的换行符仍然不正确的原因。

truncate调用是为了清空文件,以使操作更安全。如果在第一行之后文件中有任何内容,那么它将被删除。

use strict; 
use warnings; 

open my $fh, '+<', 'myfile.csv' or die "Cannot open the file: $!"; 
my $line = <$fh>; 
chomp $line; 

seek $fh, 0, 0; 
truncate $fh, 0; 

print $fh $line, ",new_data\n"; 
close $fh; 

输出

abc,add,aer,adfw,asdf,new_data 
相关问题