gpt4 book ai didi

perl - "Unrecognized character\xEF"无 BOM 文件错误

转载 作者:行者123 更新时间:2023-12-02 01:48:42 24 4
gpt4 key购买 nike

我目前正在使用 Perl 和模块 Text::CSV 从 CSV 文件中提取文本.

每个 CSV 文件都用引号分隔每个字段。文本被保存到独立的文本文件中,用制表符分隔成列。我可以毫无问题地调用和打印文本文件中的每一列,但是当我尝试在循环中使用这些值时,出现错误 Unrecognized character\xEF

我的代码示例如下:

#!/usr/bin/perl

use strict;
use warnings;
use Text::CSV;

#### Match ligand data with GPCR interaction data ####
my $csv = Text::CSV->new();
my $file = $ARGV[0];
open (FILE, "<$file");
open (OUT, ">new_$file");
while (my $line2 = <FILE>)
{
binmode(STDOUT, ":utf8");
if ($line2 =~ /^(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)$/)
{
#### Data from filtered1.txt ####
my $up_fil = $1;
my $ligid_fil = $2;
my $units_fil = $3;
my $low_fil = $4;
my $median_fil = $5;
my $upper_fil = $6;
my $ref = $7;

#### Convert negative log affinity values to normal ####
my $activity = $units_fil;
$activity =~ s/p//;
my $value;

if ($median_fil ne "")
{
$value = $median_fil;
$value = (10**-$median_fil)/(10**-9);
}
elsif ($low_fil ne "" and $upper_fil ne "")
{
my $lower = $low_fil;
$lower = (10**-$low_fil)/(10**-9);
my $upper = $upper_fil;
$upper = (10**-$upper_fil)/(10**-9);
$value = "$upper - $lower";
}
else
{
$value = "n/a";
}


#### Match entries from filtered1.txt with ligands.csv ####
open (LIG, "<ligands.csv");
while (my $line3 = <LIG>)
{
$csv->parse($line3);
my @ligand_fields = $csv->fields();
if (!$ligand_fields[14]) { next; }
if ($ligand_fields[0] eq $ligid_fil)
{
#print OUT "$ligand_fields[14]\t$ligand_fields[13]\t$up_fil\t$ligid_fil\t$activity\t$value\t$ref\n";
print "$ligand_fields[14]\t$ligand_fields[13]\t$up_fil\t$ligid_fil\t$activity\t$value\t$ref\n";
next;
}
}
close LIG;
}
}
close FILE;
close OUT;

我也尝试过按照以下方式使用正则表达式,但无济于事。

# remove BOM
${$self->{CODE}} =~ s/^(?:
\xef\xbb\xbf |
\xfe\xff |
\xff\xfe |
\x00\x00\xfe\xff |
\xff\xfe\x00\x00
)//x;

原始 CSV 文件似乎没有任何 BOM,因此我怀疑 Text::CSV 可能在解析和返回值时创建它。我希望这是对问题的足够清楚的解释,如果需要,我可以提供更多细节。在此先感谢您提供的任何建议。

最佳答案

Text::CSV 的文档声明您几乎肯定会使用二进制模式。

 my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();

来自 https://metacpan.org/pod/Text::CSV#SYNOPSIS .

您可能还想看看 Text::CSV::Encoded .

我还看到您将 binmode 设置为 :utf8在标准输出上。这有几个问题:

  1. 你每次都不必要地在循环中设置它
  2. :utf8 binmode 没有很好的错误检查,你应该使用 :encoding(UTF-8)相反

字节 0xEF 可以出现在 UTF-8 字节序列中,但只有在非常特殊的情况下,它太高 (> 0x7F) 而不是单个字符。然而在 Perl 中 \xEF\x{ef}不是指字节 0xEF,而是 Unicode 代码点 U+00EF,它在 UTF-8 中表示为 0xC3 0xAF。您可以在 Unicode/UTF-8 字符表中看到这一点,例如 http://www.utf8-chartable.de/ .

$ perl -E 'binmode STDOUT, ":encoding(UTF-8)"; say "\xEF";'
ï

所以我认为这就是为什么您用于删除 BOM 的正则表达式不起作用的原因。

我建议使用 three argument open'<:encoding(UTF-8)''>:encoding(UTF-8)'打开所有输入和输出文件,并在二进制模式下使用 Text::CSV,以获得最佳结果。

关于perl - "Unrecognized character\xEF"无 BOM 文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com