![](/img/trans.png)
[英]How can I replace a column of one file with a column of another using Perl?
[英]How can run an operation on one column of an CSV file in Perl?
我需要在具有两列的简单CSV文件中解析并转换整个列。
John, 128222971326628000
Paul, 128491909317205000
Greg, 128160037933161000
基本上,我需要对第二列执行一些算术运算,并使用此操作的结果更新该列中的值,同时保持第一列不变。
您能给我一些提示,我该怎么做吗?
我看了一些示例,但没有一个示例说明如何更新整个专栏。
预先感谢您的帮助。
听起来您需要Tie::File
:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
my $filename = shift; #get filename from commandline
tie my @records, "Tie::File", $filename
or die "could not open $filename: $!";
for my $record (@records) {
my @rec = split /, /, $record;
$rec[1] /= 2; #reduce the second column by half
#prevent perl from using scientific notation
$rec[1] = sprintf "%18.0f", $rec[1];
$record = join ", ", @rec;
}
除了已经有的答案外,我还会注意到数字的大小可能还会给您带来问题:尝试执行数学运算时,您可能会失去一些精度(这是我在Chas中运行答案时系统上发生的情况)以欧文斯为例) 如果这是您系统上的问题,则可以研究Perl的用于处理大量数字的模块: Math :: Big , Math :: BigInt等。
它在某种程度上取决于您要执行的算术运算,但是您也许可以摆脱类似的情况。 这是一个命令行示例,在文件第二列的每个数字上加1。
perl -a -n -i -e '$F[1]++;print "$_ " for @F;print "\n"' csv_file
请注意,尽管这是在示例中的空格上分开的,而不是在','上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.