【问题标题】:Converting a string to float in Perl在 Perl 中将字符串转换为浮点数
【发布时间】:2021-03-10 18:56:13
【问题描述】:

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

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

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.

还有,为什么是 "" "" 中的参数。

【问题讨论】:

  • 您没有显示 CSV 文件,但看起来该字段已被引用,并且您没有删除引号。如果您想读取重要的 CSV 数据,请使用 Text::CSV_XS,而不是 split
  • 能否请您使用 Text::CSV_XS 编写用于读取 CSV 的块,我找不到任何好的资源。
  • 文档中有例子...
  • 问题不在于将字符串转换为数字,问题在于您拥有的字符串不是数字,因为您没有正确解析 CSV。

标签: string csv perl floating-point


【解决方案1】:

使用适当的模块处理这样的数据是个好主意,因为有几个重要的细节您没有注意。例子:

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

阅读RFC-4180 文档了解更多信息。

有很多模块可以解析 CSV 格式,例如:Text:CSV。它非常容易安装,当你使用它时,你的string to double问题就会消失。

【讨论】:

  • Re "很容易安装", ...和使用!
猜你喜欢
  • 2012-05-21
  • 2011-11-25
  • 1970-01-01
  • 2011-01-02
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多