追加添加到最后一行的末尾,而不是新行

时间:2018-03-21 19:51:12

标签: perl file

所以我想说我的文本文件看起来像这样

new york
new jersey
florida
South Carolina

我要将california添加到其中,但当我这样做时,最终会看起来像这样:

new york
new jersey
florida
South Carolinacalifornia

我怎样才能将它添加到新行?我想在加利福尼亚州的附加之前创建一条新线,但是每次我运行脚本时它都会因为换行而在线之间产生间隙

3 个答案:

答案 0 :(得分:2)

据推测,您的文件是各自所有状态的列表。您的问题似乎是:"南卡罗来纳州",在最后缺少换行符,这与其他数据不一致。

这是一个数据问题。显示隐藏字符时,您的数据如下所示:

new york\n new jersey\n florida\n South Carolina

什么时候看起来像这样:

new york\n new jersey\n florida\n South Carolina\n

在这样的场景中,您的数据不一致,以编程方式修复它的最佳方法是检查文件是否以换行符结束,如果不是,则追加一个。

答案 1 :(得分:1)

问题是原始文件的最后一行不会以换行符结束。如果它的内容在你的控制之内,那么最好的解决方案就是确保打印到文件的每一行都被正确终止,但是如果你必须处理格式错误的数据,那么有几个选项

正如人们所说的那样,第一个是将整个文件读入内存,删除任何现有的chomp终结符,并在所有这些文件后使用正确的换行符将其打印回文件

如果您的文件有任何大小,那么这种方法是浪费的。您可以通过读取文件的最后一个字符并根据需要检查它是否为换行符来避免重写。然后,当打开文件进行追加时,如果最初缺少该换行,则可以先添加新行,然后再添加新数据记录。这看起来像这样

seek调用用于将读取位置移动到最后一个字符之前,然后<$fh>将读取可与"\n"进行比较的最终字符以确定是否为文件被正确终止

请注意,如果在程序运行之前文件可能完全为空或不存在,那么您必须为open失败或<$fh>的情况编写代码返回undef

use strict;
use warnings 'all';
use autodie;

use Fcntl ':seek';

my ($file) = @ARGV;

my $terminated = do {
    open my $fh, '<', $file;
    seek $fh, -1, SEEK_END;
    <$fh> eq "\n";
};

open my $fh, '>>', $file;
print $fh "\n" unless $terminated;

print $fh "california\n";

close $fh;

答案 2 :(得分:-1)

如Dkwan33所述,这可能是数据问题。您可以使用“od”命令运行并查看每行是否以\ n结尾。

 od -bc data.txt
0000000 156 145 167 040 171 157 162 153 012 156 145 167 040 152 145 162
      n   e   w       y   o   r   k  \n   n   e   w       j   e   r
0000020 163 145 171 012 146 154 157 162 151 144 141 012 123 157 165 164
      s   e   y  \n   f   l   o   r   i   d   a  \n   S   o   u   t
0000040 150 040 103 141 162 157 154 151 156 141 012
      h       C   a   r   o   l   i   n   a  \n
0000053

如果你想通过Perl处理它,那么我建议你先在每一行上做“chomp”,然后用\ n打印该行。