2014-03-28 139 views
0

嗨我的CSV文件可讀性有問題。 我目前正在嘗試使用PERL。以下是我的代碼行:使用PERL將BOM插入CSV文件

#!/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文件仍然不可讀。 有什麼我可以做的插入物料清單? 謝謝!

回答

0

我認爲你需要像這樣在你的代碼的頂部:

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

你可能想要做的,而不是手動插入一個BOM什麼,是set the output file encoding to whatever it is you need

另外:

  • 您輸入記錄分隔符設置爲文本字符串"undef",你想要的是絕對不是! (儘管只要undef沒有出現在輸入文件中,它就會正常工作)。刪除那裏的引號。
  • use warnings; use strict;
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 $_; 
} 
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>;