在perl中读取文件时删除特殊字符



我有一个Excel表格(Test.xls),它有以下内容:

Name,account,flat Number,city
A,111111,1352†,XXXX
B,222222,2352†,YYYY
C,333333,3352†,YYYY

第三列的特殊字符为†

使用Perl 5.12.5版本运行Perl脚本a.pl时出现以下错误:

在test.pl第2行打印宽字符

但是当我用Perl 5.6.1版本执行相同的脚本时,我们不会得到这个错误。

请有人指导如何忽略/删除这个特殊字符,同时通过parseexcel模块读取excel工作表的内容。

和Perl 5.6.1,为什么这个特殊字符在通过parseexcel模块获取文件内容时被忽略。

#!/Volumes/app/perl/5.12/bin/perl -w
use Spreadsheet::ParseExcel;
my $srce_file = "a.xls"; 
my $oExcel = new Spreadsheet::ParseExcel;
my $oBook = $oExcel->Parse($srce_file); 
my %hah_sheet = ();
my $header_row  = 1;
my($iR, $iC, $oWkS, $oWkC);
my $book = $oBook->{File};
my $nsheet= $oBook->{SheetCount};
my $author= $oBook->{Author};
unless($nsheet){
print "ERR>No worksheet found for source file:$srce_filen";
return 0;
}
else{
print "INFO>Excel                         
File=$srce_file,#WorkSheet=$nsheet,AuthorID=$authorn";
}

for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
next if($iSheet >0);    
$oWkS = $oBook->{Worksheet}[$iSheet];
my $rows = 0;
for(my $iR = $oWkS->{MinRow}; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
$rows++;
my $str_len = 0;
for(my $iC = $oWkS->{MinCol}; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol}; $iC++) {
$oWkC = $oWkS->{Cells}[$iR][$iC];
next if ($iR <$header_row);

if (defined($oWkC)){
my $cell_value = $oWkC->Value;
$cell_value =~s/n+//g;               #removed newline inside the value
#
##if the first column at header row is null then skip. Column might be shifted
if($iR==$header_row && $iC == 0){
last unless($cell_value);
}
if($iR == $header_row){
$hah_sheet{$iR}{$iC} = uc($cell_value);
}else {
$hah_sheet{$iR}{$iC} = $cell_value;
$str_len += length($cell_value);  
##View cell value by row/column
print "DEBUG>row ${iR} - col ${iC}:$cell_valuen";
}
}else{
$hah_sheet{$iR}{$iC} = "";              #keep position for NULL value
}
} # END of Column loop
} # END of Row loop
} # END of Worksheet

perl 5.12版本的输出:

INFO>Excel File=a.xls,#WorkSheet=1,AuthorID=
DEBUG>row 2 - col 0:Name
DEBUG>row 2 - col 1:account
DEBUG>row 2 - col 2:flat Number
DEBUG>row 2 - col 3:city
DEBUG>row 3 - col 0:A
DEBUG>row 3 - col 1:111111
Wide character in print at ./a4_test.pl line 49.
DEBUG>row 3 - col 2:1352†
DEBUG>row 3 - col 3:XXXX
DEBUG>row 4 - col 0:B
DEBUG>row 4 - col 1:222222
Wide character in print at ./a4_test.pl line 49.
DEBUG>row 4 - col 2:2352†
DEBUG>row 4 - col 3:YYYY
DEBUG>row 5 - col 0:C
DEBUG>row 5 - col 1:333333
Wide character in print at ./a4_test.pl line 49.
DEBUG>row 5 - col 2:3352†
DEBUG>row 5 - col 3:YYYY

perl 5.6.1版本的输出:-

INFO>Excel File=a.xls,#WorkSheet=1,AuthorID=
DEBUG>row 2 - col 0:Name
DEBUG>row 2 - col 1:account
DEBUG>row 2 - col 2:flat Number
DEBUG>row 2 - col 3:city
DEBUG>row 3 - col 0:A
DEBUG>row 3 - col 1:111111
DEBUG>row 3 - col 2:1352
DEBUG>row 3 - col 3:XXXX
DEBUG>row 4 - col 0:B
DEBUG>row 4 - col 1:222222
DEBUG>row 4 - col 2:2352
DEBUG>row 4 - col 3:YYYY
DEBUG>row 5 - col 0:C
DEBUG>row 5 - col 1:333333
DEBUG>row 5 - col 2:3352
DEBUG>row 5 - col 3:YYYY

我对您的数据一无所知,也不知道它意味着什么,但我通常反对更改数据以压缩编程警告。如果v5.6版本可以工作,但v5.12不能,那么您可能希望保留数据。(而且,5.6是古老的,是Perl第一次与Unicode打交道的一部分。我们没有正确地做很多事情,没有认识到并警告我们应该做的所有情况。现在我们知道了更多,所以你得到了一个已经存在问题的警告)。

这个特殊的警告告诉你,你没有告诉Perl如何编码输出,它试图打印一个" width "(多于一个八位)字符。这通常意味着输出的形式可能不是目的地所期望的(参见mojibake)。

假设您想要UTF-8输出,一个快速修复方法是告诉Perl将其标准文件句柄编码为UTF-8。一种常见的方法是通过open pragma:

use open ':std', ':encoding(UTF-8)';

学习Perl的最新版本的末尾有一个关于Unicode的入门,以及正确处理它所需做的各种事情。


但是假设您不想要(并且您有一个很好的理由,除了没有得到警告之外)。可以使用Perl的普通文本操作特性,例如替换操作符:

use utf8;  # tell Perl source is UTF-8
$column =~ s/†//g;

或者,如果不想键入文字字符,可以通过代码编号指定:

$column =~ s/x{2020}//; # goodbye 2020

相关内容

  • 没有找到相关文章

最新更新