使用PERL将BOM插入CSV文件

时间:2014-03-28 10:43:20

标签: perl csv byte-order-mark

您好我的CSV文件可读性问题。 我目前正在尝试使用PERL。这是我的代码行:

#!/usr/bin/perl

$infile = @ARGV[0];
$outfile = @ARGV[1];

open(INFILE,"$infile") || die "cannot open input file : $infile : ";

open(OUTFILE,">$outfile") || die "cannot open output file";

$/="undef";

while(<INFILE>)

{

  $temp=$_;

}

close(INFILE);

  print OUTFILE "\x{feff}".$temp;

close(OUTFILE);

但是,CSV文件仍然无法读取。 我可以做些什么来插入BOM吗? 谢谢!

4 个答案:

答案 0 :(得分:2)

在我们这样做之前,让我告诉你,在大多数情况下,BOM是一种令人难以置信的痛苦,应该尽可能避免。它们仅在技术上需要UTF-16编码。 BOM是Unicode字符U + FEFF。它以UTF-8编码为EF BB BF,UTF-16LE编码为FF FE,UTF-16BE编码为FE FF。看来你假设你的输入是UTF-16BE,在这种情况下你可以直接写字节:

open my $in,  "<:raw", $ARGV[0] or die "Can't open $ARGV[0]: $!";
open my $out, ">:raw", $ARGV[1] or die "Can't open $ARGV[1]: $!";

print $out "\xFE\xFF";
while (<$in>) {
    print $out $_;
}

但是解码和再次编码输出可能会更好,并明确将BOM指定为字符:

open my $in,  "<:encoding(UTF-16BE)", $ARGV[0] or die "Can't open $ARGV[0]: $!";
open my $out, ">:encoding(UTF-16BE)", $ARGV[1] or die "Can't open $ARGV[1]: $!";

print $out "\N{U+FEFF}";
while (<$in>) {
    print $out $_;
}

答案 1 :(得分:1)

您可能想要做的事情是set the output file encoding to whatever it is you need,而不是手动插入物料清单。

此外:

  • 您正在将输入记录分隔符设置为文字字符串"undef",这绝对不是您想要的! (虽然只要undef没有出现在输入文件中,它就会发挥作用)。删除那里的引号。
  • use warnings; use strict;

答案 2 :(得分:0)

我认为你的代码顶部需要这样的东西:

use open OUT => ':encoding(UTF-16)';

答案 3 :(得分:0)

您的BOM有几个答案。但是这里的代码是用更加惯用的Perl编写的。

#!/usr/bin/perl

use strict;
use warnings;

my ($infile, $outfile) = @ARGV;

open my $in_fh, $infile or die "cannot open input file : $infile : $!";
open my $out_fh, '>', $outfile or die "cannot open output file: $!";

print $out_fh "\x{feff}";
print $out_fh while <$in_fh>;