【问题标题】:Perl read CSV and manipulate dates and numbersPERL读CSV和操作日期和数字
【发布时间】: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

标签: regex csv perl


【解决方案1】:

感谢 cmets,我检查了 csv 文件的编码并自己弄清楚了, 线

open(my $fh, '<', $file) or die("ERROR open $file ($!)\n");

不得不改成

open(my $fh, '<:encoding(UTF-16LE)', $file) or die("ERROR open $file ($!)\n");

因为编码是 UTF-16,我一开始没有意识到。

但仍然感谢 cmets,他们是我发现错误的原因:)

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2020-02-08
    • 2016-11-03
    • 2014-10-10
    • 2015-07-11
    相关资源
    最近更新 更多