【发布时间】:2020-07-09 19:02:10
【问题描述】:
我遇到了一个问题,花了好几个小时来理解它......
我想使用 perl 读取 .csv 文件,查找日期(和数字),将日期排列为另一种格式并将数字添加到现有数字中。
.csv 中的数据是带有“;”的简单字段分隔符。
日期在 .csv 文件中以 01.01.2000 格式存在,我想将 ist 格式化为 2000-01-01。金额以“-200”的形式存在。
现在读取并将其放入变量中可以正常工作。 但是变量的行为与其他变量不同,我无法在它们上正确使用正则表达式,如果我尝试将金额添加到另一个变量,我会收到以下错误: 参数 "\x{0}-\x{0}5\x{0},\x{0}6\x{0}6\x{0}" 不是数字加法 (+)
现在在我看来,数据编码存在问题,我没有正确处理,但经过几次“endode、解码、升级降级等”尝试后,我无法让它工作. 如果我将这些变量保存到一个文本文件并手动打开它,它会告诉我该文件以 utf8 编码并且是只读的。
我在这里遗漏了什么以及关于编码我需要了解什么,我阅读了很多关于它的内容,但在我的情况下我仍然没有真正理解。
编辑: 抱歉我之前的代码不足。以下代码应独立运行:
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use Text::CSV;
use Data::Dumper qw(Dumper);
my $file = "test.csv";
my $s_delimiter = ";";
open(my $fh, '<', $file) or die("ERROR open $file ($!)\n");
my $csv = Text::CSV->new({binary => 1, sep_char => $s_delimiter});
# read File
while( my $row = $csv->getline( $fh ) )
{
my @array = @{$row};
my $arraylength = @array;
my $date = $array[2];
my $amount = $array[6];
$amount += 200;
print "$amount\n";
$date =~ /(\d\d).(\d\d).(\d\d\d\d)/;
print "$date\n";
print "$3 $2 $1\n";
}
close $fh;
提前感谢您的帮助!
【问题讨论】:
-
看起来我们可能需要查看更多您的代码。您的错误涉及添加,但我们可以看到的任何代码中都没有添加。此外,查看示例输入文件会很方便。也许你可以把它放到网上某个地方,这样我们就可以看到编码了。
-
Edit 问题并添加minimal reproducible example。这是一个完整的、可运行的程序,可以重现错误。包括输入,即您案例中的 CSV 文件。 不要只发布您的所有代码,而是发布一个最小化版本,其中仅包含重现错误所需的所有内容,仅此而已。
-
您可能需要在您正在读取的文件句柄上设置正确的编码。你知道输入文件的编码吗?
-
感谢您的快速回答,代码已更新。有没有办法在这里上传.csv?编码好像是UT-16