perlでのcsv形式のテキストファイルの変換

このQ&Aのポイント
  • Perlを使用して、csv形式のテキストファイルを指定された条件で変換する方法について教えてください。
  • 変換前のcsv形式のテキストファイルを、指定された条件に基づいて変換するPerlのコードを教えてください。
  • Perlを利用して、csv形式のテキストファイルを特定の条件で変換する方法について教えてください。
回答を見る
  • ベストアンサー

perlでのcsv形式のテキストファイルの変換

perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

そのまま実装しました。 省略表現が初心者には難しいかもしれませんが、その分見やすいと思います。 インデントは全角スペースになっています。 #!/usr/bin/perl use strict; my($m1, $m2, $m3); open(IN, "in.csv") or die; open(OUT, "> out.csv") or die; while(<IN>){  my($n1, $n2, $n3) = split /,/;  if($n1 eq $m1 && $n2 eq $m2 && $n3 eq $m3){   next;  }else{   ($m1, $m2, $m3) = ($n1, $n2, $n3);   print OUT;  } }

emo_ken
質問者

お礼

教えていただいたとおりにやってみたところ 所望の結果が得られることが確認できました。 困っていましたので、本当に助かりました。 ありがとうございました。

関連するQ&A

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • PerlでCSV形式のファイルの一部分だけを抽出する方法

    Perlをやっていて困っていることがあります。 CSV形式のファイルを開いて、変数に代入した後の処理がわかりません。 どのようにしたいかというと・・・ aaa,bbb,ccc,ddd,eee,fff ggg,hhh,iii,jjj,kkk,lll mmm,nnn,ooo,ppp,qqq,rrr sss,ttt,uuu,vvv,www,xxx yyy,zzz,111,222,333,444 というファイルを読み込んだとします。その後 'fff' の部分だけをスカラー変数に取り込みたいときにはどのような 関数を実行すればいいのでしょうか。 困っています、お願いします。

    • ベストアンサー
    • Perl
  • Perlでのテキスト変換方法に関して

    テキストファイルをperlを使用して下記のように 変換したいと思っています。 --------------------------- 【変換前】 aaa 8000 52 ---1行目 abc 200 48 ---2行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 aaa 65 40   ---7行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 abc 40 40 ---10行目 【変換後】 aaa 8000 52   ---1行目 cbd 250 31   ---3行目 efg 98 45   ---4行目 abc 390 68   ---5行目 ddd 89 90   ---6行目 fed 900 66   ---8行目 efgh 99 49 ---9行目 ---------------------------- やりたいことはまず行の先頭文字列(aaaやabc)が完全に一致する行が 複数あれば(2,5,10行目のabcや1,7行目のaaa)、2番目の文字列(スカラー値)の値が 小さい方の行は出力しないようにしたいと思っています。 例えば上記の場合ですと、2,5,10行目の最初の文字列はaaaで完全に一致しており、 2番目の列の値は5行目が390に対し、2行目は200、10行目は40と小さくなっているため 2行目,10行目は出力されない、というのが望んでいる動作です。 sortを使用してどうにかならないかとも、考えたのですが そこから先がどうしていいか思いつきませんでした。 何かよい方法を思い浮かぶ方がいましたら、どのようにPerlで記述すればよいのか 教えて頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

    CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

  • 外部ファイルからの指定行と指定文字の削除

    perlで、外部のCSVファイル(01_01.csv)を読み込み、「先頭の9行」とその行以降の「先頭9文字」を削除したものを [01_01_out.csv]として保存したいのですがどのようにしたらいいのでしょうか。 ご回答、よろしくお願い致します。 例) 読込ファイル:01_01.csv ---------------------------------------- AAA BBB CCC DDD EEE FFF GGG HHH 00:00:00,1 00:01:00,2 00:02:00,3 00:03:00,4 00:04:00,5 00:05:00,6 (略) 10:00:00,101 10:01:00,102 10:02:00,103 10:03:00,104 10:04:00,105 10:05:00,106 ---------------------------------------- 出力ファイル:01_01_out.csv ---------------------------------------- 1 2 3 4 5 6 (略) 101 102 103 104 105 106 ----------------------------------------

  • CSVデータをツリー表示させたい

    業務で、WEBサイトにCSVデータを表示させたいと考えています。 CSVデータは、毎日更新されるもので、行数も日々変更されます。 項目の中に「レベル」という項目があり、この「レベル」の値を使って、 ツリー表示出来ないかと考えています。 希望としては、決められたフォルダに決められたファイル名で、 CSVデータを置けば、自動的にWEB上にツリー表示されるという ことです。 J-query等で、これを実現出来るプラグインが無いか探しているのですが、 なかなか希望に合うものが見つからず、困っています。 (CSVをWEB表示するものは見つかるのですが、ツリー表示出来る ものが見つかりません) 何か、良い方法があれば、ご教示頂けませんでしょうか? 例 コード  レベル 品名  規格 ・・・・    コード     レベル 品名  規格 ・・・・  1234    1   AAA   aaa       -1234       1    AAA   aaa 2345    2   BBB   bbb        ∟2345     2    BBB  bbb 3456    3   CCC   ccc          ∟3456   3    CCC  ccc 4567    3   DDD   ddd          ∟4567   3    DDD  ddd 5678    3   EEE   eee           ∟5678   3    EEE  eee 6789    4   FFF   fff             ∟6789  4    FFF   fff 7890    3   GGG  ggg           ∟7890   3    GGG  ggg

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

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

    • ベストアンサー
    • Perl
  • VBAでCSV内にある改行を取る方法

    あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb  bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。

  • 複数種類の括弧でくくられてない文字をマッチングさせたい

    Perlの正規表現で質問です。 複数種類の括弧、たとえば()、【】、[]などで囲まれていない文字をマッチングさせたいのです。 括弧は1行に複数ある可能性があり、ない場合もあります。 (abc)【def】ghi【jkl】 だとghiの部分。 【abc】【def】(ghi)jkl(mno) だとjklです。 頭に必ず括弧が来たり、括弧が一回だけなら括弧閉じるの種類をor検索ではじけるのですが、何回くるかわからないのでどうしたらいいか困っています。 方法がありましたら教えてください。

    • ベストアンサー
    • Perl
  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl

専門家に質問してみよう