我有一个程序从许多其他文件中提取数据,以形成一个大的(~200MB)批量SQL插入语句
INSERT INTO ...
VALUES
('a','b',1,2,3),
('c','d',4,5,6),
不幸的是,最后一行需要以分号而不是逗号结束。有没有办法(理想情况下在我的perl程序中)只将最后一个字符从,
转换为;
?
我尝试过的事情:
1)文件完成并关闭后:
open(DAT,">>$output") || die("Cannot Open File");
seek(DAT, 2, SEEK_END);
print DAT ";";
close(DAT);
这只是在最后加上一个分号。
2)在我的perl程序中调用`perl -p -i -e 's/,$/;/g' $output`;
,但这会替换每个逗号。
3)在打印最后一行时,以分号而不是逗号结束。然而,这不起作用,因为在写完这一行之前,我实际上并不知道它是最后一行。
4)将整个文件复制到一个新文件中,但最后一个字符是;
而不是,
。然而,这很慢,因此并不理想。
答案 0 :(得分:4)
如果你知道','你正在替换它总是将成为文件中的第二个最后一个字节(最后一个字节是“\ n”),那么你可以试试这个:
my $fsize = -s $filename;
# print $size."\n";
open($FILE, "+<", $filename) or die $!;
seek $FILE, $size-2, SEEK_SET;
print $FILE ";";
close $FILE;
答案 1 :(得分:1)
你试过
perl -p -i -e 's/,$/;/g'
这将替换文件中的每一行。要只执行一次,请使用-0
开关来覆盖文件:
perl -0777 -pi -e 's/,$/;/'
仅当最后一个字符是逗号(带有可选的尾随换行符)时才会匹配。如果你有尾随空格或其他字符,它将无效。
答案 2 :(得分:0)
你使用wron offset。 SEEK_END将(!)偏移量添加到END位置。所以使用“-2”作为偏移量。试试这个:
use strict;
use warnings;
open my $fh, "+<x.txt" or die;
seek $fh, -2, 2;
print $fh ";\n";
close $fh;
或者说一点点健谈:
use strict;
use warnings;
use Fcntl qw(SEEK_END);
open my $fh, "+<x.txt" or die;
seek $fh, -2, SEEK_END;
print $fh ";\n";
close $fh;