4

我有一个程序,它从许多其他文件中提取数据以形成一个大的(~200MB)批量 SQL 插入语句

INSERT INTO ...
VALUES
('a','b',1,2,3),
('c','d',4,5,6),

不幸的是,最后一行需要以分号而不是逗号结尾。有没有办法(理想情况下在我的 perl 程序中)只将最后一个字符从 a,变成 a ;

我尝试过的事情:

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) 将整个文件复制到一个新文件中,除了最后一个字符是 a;而不是 a ,。然而,这很慢,因此并不理想。

4

3 回答 3

4

如果您知道要替换的 ',' 始终是文件中的倒数第二个字节(最后一个字节是“\n”),那么您可以试试这个:

my $fsize = -s $filename;  
# print $fsize."\n";
open($FILE, "+<", $filename) or die $!; 
seek $FILE, $fsize-2, SEEK_SET; # or 0 (numeric) instead of SEEK_SET
print $FILE ";";
close $FILE;
于 2013-04-09T18:11:45.670 回答
1

你试过

perl -p -i -e 's/,$/;/g' 

这将在文件中的每一行应用此替换。只做一次,使用-0开关 slurp 文件:

perl -0777 -pi -e 's/,$/;/'

仅当最后一个字符是逗号(带有可选的尾随换行符)时才会匹配。如果您有尾随空格或其他字符,它将不起作用。

于 2013-04-09T18:04:36.927 回答
0

您使用了错误的偏移量。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;
于 2013-04-09T21:46:31.550 回答