【问题标题】:Perl - Reading a file and appending data to a line that is already existing [duplicate]Perl - 读取文件并将数据附加到已经存在的行[重复]
【发布时间】:2014-06-26 16:05:02
【问题描述】:

我有一个仅包含一行的 .csv 文件。假设文件名为 new.csv,其中的行是 > abc,add,aer,adfw,asdf

现在我正在尝试读取此文件,然后尝试通过像这样写入同一个文件来将另一个数据附加到该文件中。

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

通过运行

预期输出:

abc,add,aer,adfw,asdf, new_data

实际输出:

abc,add,aer,adfw,asdf 新数据

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

我尝试过的其他事情是

  1. 我尝试写入一个全新的文件,然后使用 system() 函数将新文件替换为旧文件。

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

  3. 我尝试将行发送到新变量,然后附加数据,然后写入文件。

他们都失败了。

感谢您的帮助。

赛帕万·亚拉古提

【问题讨论】:

    标签: perl file csv append


    【解决方案1】:

    即使我在 $_ 上使用了 chomp。

    在您的情况下,$_ 是当前输入行的内存副本,因此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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多