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



假设我有看起来像这样的文本文件

new york
new jersey
florida
South Carolina

我将附加california,但是当我这样做时,它最终看起来像这样:

new york
new jersey
florida
South Carolinacalifornia

如何使其附加到新行?我想过在附加加利福尼亚之前制作一个新行,但是每次我运行脚本时,由于新行,它只会在行之间有间隙

大概你的文件是一个状态列表,所有的状态都在自己的行上。您的问题似乎是行:"南卡罗来纳州"末尾缺少换行符,这与其余数据不一致。

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

new yorkn new jerseyn floridan South Carolina

当它应该看起来像这样时:

new yorkn new jerseyn floridan South Carolinan

在此类情况下,数据不一致,以编程方式修复它的最佳方法是检查文件是否以换行符结尾,如果不是,则附加一个。

问题是原始文件的最后一行没有用换行符终止。如果它的内容在您的控制范围内,那么最好的解决方案就是确保打印到文件的每一行都正确终止,但如果你必须处理格式不正确的数据,那么有几个选择

正如人们所说,第一种是将整个文件读入内存,删除任何现有的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 "californian";
close $fh;

正如 Dkwan33 所提到的,这可能是数据问题。您可以使用"od"命令运行并查看每行是否以结尾。

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",然后用打印该行。

最新更新