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

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

csvファイル(表計算的な処理)

今、次のようなcsvファイル(ファイル名: test.csv)があります。 id , year, aaa, 2000, aaa, 2001, aaa, 2002, bbb, 2000, bbb, 2001, 次の処理を行いたいのですが、初心者のため分かりません。 ・yearの横の列にflagという新たな列を設ける。 ・idが上行のidと一致した場合、flagに0を入力する。 ・idが上行のidと一致しなかった場合、flagに1を入力する。 最終的な形は、 id , year, flag, aaa, 2000, 1, aaa, 2001, 0, aaa, 2002, 0, bbb, 2000, 1, bbb, 2001, 0, のようなcsvファイルを新たに作りたいと考えております。 perlでこのような処理は可能なのでしょうか? 初歩的な質問で恐縮ですが、ご存知の方がいらっしゃったら、 お教えいただければ幸いです。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • Rubyを使用してcsvファイルを処理しているのですが、どうしてもでき

    Rubyを使用してcsvファイルを処理しているのですが、どうしてもできない事があり質問させていただきました。 下記のようにCSVファイルを処理したいのですが教えてください。 処理前CSVファイル内容:"abc",111,bbb,"ccc","123" 処理後CSVファイル内容:"abc",111,bbb,"xxx","321" 普通にCSVparserを用いて処理すると下記のようダブルクォーテーションが消えてしまいます。 処理後CSVファイル内容:abc,111,bbb,xxx,321 ご教授お願い致します。

  • CSVファイルをperlプログラムで処理する場合

    すみません、度々perl初心者のものです。 CSVファイルを1行ずつ読み込んで処理をしたい場合、 1項目内のデータの中に改行がある場合、 どのような方法で対処出来るでしょうか? 例えば "aaa,bbb,ccc ddd,eee,fff" 上記のようにcccとdddの間に改行が入ってるため 本当は1レコードのはずなのに2レコードとして 処理を行ってしまう。 perlで何かやり方はあるのでしょうか? csvを加工するのもよいのですが、データが多量に あるため、プログラム上でなんとかしたいと思うのですが。。。 すみません、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • ファイル処理について

    宜しくお願いします。 ファイル「ppp.txt」の中の文字列を逆にする コードを組みたいのですが、どの本を読んでも ロジックが見当たりません。 ファイルppp.txtの中は以下です。 AAA BBB CCC DDD EEE -> EEE DDD CCC BBB AAA としたいのです。 じっくり探せばあると思うのですが、 急ぎなので投稿しました。 これを実現するPerlスクリプトコードを 教えて頂けないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • バッチ処理でCSVファイルコピーした後の記号削除方法

    こんにちは。バッチ処理作成初心者です。 Windows XP、エクセル2000 を使用しています。 複数のcsvファイルをバッチ処理(下記)でコピーしました。 copy /y aaa.csv+bbb.csv ccc.csv (結合させるcsvファイルは最大6つありますが、 上記コマンドでは2つのcsvファイルを結合させてます。) コピーしたcsvファイル「ccc」を開くと、必ず最終行A列に "・"という記号が現れます。 この記号を、「ccc」を開かずに削除する方法 もしくは、csvファイルをコピーしても記号が現れない方法を 教えてください。 (「ccc」は行数が最大で18万行を超えるため、いつも ファイルを開いて記号を削除することができません。)

  • ExcelでCSVファイルを読み込むとき

    ExcelでCSVファイルを読み込むとき、0(ゼロ)で始まる数字の文字列を正しく読み込むためには、どうすればいいのでしょうか たとえば次のようなCSVファイルを読み込むと 先頭の0が省かれてしまいます。 01234,aaa[cr][lf] これがダメ 「1234」と表示されてしまう "01234",aaa[cr][lf] これもダメ 「1234」と表示されてしまう セルに「01234」と表示出来るようにするにはどうしたらいいのでしょうか?教えてください。お願いします。 ご存知の方、教えてください。

  • split で " または ' で挟まれた部分を一つとして処理するには?

    perl で 文字列を split で処理する時に、" や ' で挟まれた領域を一つの文字列として処理するにはどうやったらよいのでしょうか? たとえば $aaa = "aaa bbb 'c d e' fff"; @aaa = split(/ /, $aaa); だと、 aaa bbb 'c d e' fff となってしまいますが、 aaa bbb 'c d e' fff となるようにするにはどうするのでしょうか?

    • ベストアンサー
    • Perl
  • csv作成エラー

    CSVファイルを作ろうとcsvフォルダを作り、xmlファイル・xslファイルを入れました。 C:\csv\aaa.xml C:\csv\bbb.xsl コマンドプロンプトで C:\csv>java org..apache.xalan.xslt.Process -in aaa.xml -xsl bbb.xsl -out ddd.csv と入力したら、 file:/C:/csv/bbb.xsl;行番号1;列番号-1;XSLTエラー(javax..xml.transform.TransformerConfigurationException):javax..xml.transform.TransformerException: org.xml.sax.SAXParseException: ドキュメントのルート要素がありません。 と表示されてうまくいきません。 xslファイルの1行目には、<?xml version="1.0" encoding="utf-8"?>と記載されています。 教えていただけたらうれしいです。

    • ベストアンサー
    • XML

専門家に質問してみよう