• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:csvファイル(表計算的な処理))

csvファイルをperlで処理する方法について

このQ&Aのポイント
  • csvファイルをperlで処理する方法について質問があります。
  • 具体的には、csvファイル内の特定の列に基づいて新しい列を追加し、特定の条件に基づいて値を設定したいです。
  • この処理がperlで可能かどうか、また、初心者にも理解しやすい方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

idの保存というのは単にそれ用の変数を別に用意しておいて、 次回の実行のために値をコピーするだけですよ。 たとえばこんなかんじ。 use strict; open(FILE, 'test.csv') or die "can't open input($!)"; open(NEWFILE, '> atest.csv') or die "can't open output($!)"; my $prev_id = undef; while (my $line = <FILE>) { chomp $line; if ($line =~ /^id/) { print NEWFILE "id,year,flag\n"; next; } my ($id, $year) = split(/,/, $line); #ここの処理が分かりません。 #------ my $flag; if ($id eq $prev_id) { $flag = 0; } else { $flag = 1; } $prev_id = $id; #----- print NEWFILE join(',', $id, $year, $flag), "\n"; } close(NEWFILE); close(FILE); $prev_id はwhileループの中で宣言できないので注意です。 $flagへの値のセットは条件演算子(?:)を使ってもいいですが、その辺はお好みで。

hunter_paul
質問者

お礼

完璧です。本当にありがとうございました。 一日悩んでいた問題があっという間に解決しました。 これで効率よく作業を進めることができそうです。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

たぶん誰かがスクリプト書いちゃうだろうけど考え方だけ。 ・1行ずつ入力して、',' で分解 ・id を保存しておいて、一つ前の行のidと比較する ・比較の結果からflagの値を決める ・三つの要素を ',' で join して出力。 一行目の見出し行と、二行目を特別扱いする必要があるけど まあこんな感じで。 #二行目はそうでもないか

hunter_paul
質問者

補足

1つ目と4つ目の処理は、何とか分かるのですが、 2つ目と3つ目の ・id を保存しておいて、一つ前の行のidと比較する ・比較の結果からflagの値を決める が分からない次第です。特にidを保存→一つ前の行のidとの比較という 部分がどのように書けばよいか見当もつかない状況です。 勉強不足は痛感しておりますが、もし分かれば お教えいただければ幸いです。 open(FILE, 'test.csv') or die "$!"; open(NEWFILE, '> atest.csv') or die "$!"; while (my $line = <FILE>) { chomp $line; my ($id, $year) = split(/,/, $line); #ここの処理が分かりません。 print NEWFILE join(',', $id, $year, $frag), "\n"; } close(NEWFILE); close(FILE);

すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>perlでこのような処理は可能なのでしょうか? 単純明快な回答として  「可能」 どういうソースになるのかって? それはここのサイトでは「自分で考えよう」って事になってるから教えられないよ。 うまくいかなくて「どこがおかしいのか添削してくれ」ならアリ

すると、全ての回答が全文表示されます。

関連するQ&A