您好我的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吗? 谢谢!
答案 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>;