Как выполнить операцию над одним столбцом файла CSV в Perl? - PullRequest
1 голос
/ 05 августа 2009

Мне нужно проанализировать и преобразовать весь столбец в простой CSV-файл с двумя столбцами.

John, 128222971326628000
Paul, 128491909317205000
Greg, 128160037933161000

В основном мне нужно выполнить некоторую арифметику для второго столбца и обновить значение в столбце с результатом этой операции, оставив первый столбец без изменений.

Не могли бы вы дать мне несколько советов, как мне поступить?

Я посмотрел несколько примеров, и ни один из них не объясняет, как обновить весь столбец.

Заранее благодарю за помощь.

Ответы [ 4 ]

3 голосов
/ 05 августа 2009

Звучит так, будто тебе нужно 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;
}
2 голосов
/ 05 августа 2009

В дополнение к ответам, которые у вас уже есть, я хотел бы отметить, что размер чисел может представлять для вас проблему: вы можете потерять некоторую точность при попытке выполнить математику (это то, что происходило в моей системе, когда я запускал ответ час. Оуэнса, например). Если это проблема в вашей системе, вы можете взглянуть на модули Perl для работы с большими числами: Math :: Big , Math :: BigInt и т. Д.

1 голос
/ 06 августа 2009
  1. Используйте Text :: CSV для извлечения данных (для сложных файлов CSV) http://metacpan.org/pod/Text::CSV

2. Делайте все, что вам нужно.

  1. Запишите это обратно в файл

Надеюсь, это поможет

1 голос
/ 05 августа 2009

Это зависит от того, какую арифметику вы хотите сделать, но вы можете избежать неприятностей с чем-то вроде этого. Вот пример командной строки, который добавляет 1 к каждому числу во втором столбце файла.

perl -a -n -i -e '$F[1]++;print "$_ " for @F;print "\n"' csv_file

Обратите внимание, что в вашем примере это разделение на пробел, а не на ','.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...