替换大文件中的最后一个字符

时间:2013-04-09 17:51:22

标签: perl

我有一个程序从许多其他文件中提取数据,以形成一个大的(~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)将整个文件复制到一个新文件中,但最后一个字符是;而不是,。然而,这很慢,因此并不理想。

3 个答案:

答案 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;