Warm tip: This article is reproduced from serverfault.com, please click

csv-将字符串转换为在Perl中浮动

(csv - Converting a string to float in Perl)

发布于 2020-11-28 05:26:27

我是Perl的新手。我正在使用Perl读取CSV文件。CSV的第一列是时间(浮点数)。我已经阅读了CSV并成功显示了CSV的内容。此外,我希望将CSV数据用于某些计算。我需要时间列作为数组(或任何数据结构)。在读取时间列并将其存储在数组中时,它会以字符串形式存储。我希望有一个用于算术运算的数字数组。

我尝试添加0,mul 1,然后使用sprintf将其存储在数组中,但遇到错误。

use v5.30.0;
use strict;
use warnings;

my $file = $ARGV[0] or die;
open(my $data, '<',$file) or die;
my @timeArray;

while(my $line = <$data>){
    chomp $line;
    my @words = split ",",$line;
    #my $temp=$words[1]*1;
    my $temp=sprintf "%.6f",$words[1];
    push @timeArray,$temp;
}

错误:

Argument ""67.891947295"" isn't numeric in multiplication (*) at 3.pl line 12, <$data> line 19556.

and 

Argument ""67.840034174"" isn't numeric in sprintf at 3.pl line 13, <$data> line 19555.

另外,为什么在“”“”中使用自变量。

Questioner
time_remnant
Viewed
0
Miguel Prz 2020-11-28 15:37:08

用适当的模块处理类似的数据是个好主意,因为有一些重要的细节你不必理会。例子:

  • 列值可以用引号引起来
  • 第一行可能包含每列的标题名称
  • 文件中的最后一条记录可能有也可能没有换行符
  • 等等。

阅读RFC-4180文档以获取更多信息。

有很多模块可以解析CSV格式,例如:Text:CSV它非常容易安装,并且当你使用它时,双重字符串问题将消失。