• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlの文字列削除とcsv出力の方法について)

Perlの文字列削除とcsv出力の方法について

このQ&Aのポイント
  • Perlを使用してtxtファイルから必要なデータを取得し、csvファイルに出力する方法について説明します。
  • txtファイルに含まれる特定の文字列を抽出し、csvファイルに1行ずつ出力する方法をPerlで実現する方法を探しています。
  • Perlを初めて使用してtxtファイルから特定のデータを抽出し、csvファイルに出力する方法についての質問です。

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

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

対象のデータのフォーマットですが > *○ △ /△/△/△/△/○.txt, ○|○): ○ > ○,△:任意の数字、または文字列です。 だったのが > Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd.txt,1|0): Error_contents と食い違いがありますよね。 ・Error_check: ・*Error の後の△に対応するものは? ・開きガッコ ・二つめの○に対応するものとして取り出したい内容に .txt は含まれる? .txtのあとのカンマの後の空白 といったあたり。 最初の例だと 1|0 は1と0として取り出したいように読めるのですが、後で出された例ではまとめてのようですがこれは? また、/…/ddd.txt はなにかファイルのパスのように見えますがこの段数も二つの例で数が違います。 どちらが正しいのかあるいは可変なのか? Error_contents も本当にこの字面が並んでいるんじゃなくて、エラーの内容などを表す文字列がくるのではないですか? (Error_checkもそうだったりして?) いずれにしても、どういった書式のデータがくるのかがはっきりわかれば他の方がいろいろ例を出しているように 書きようはあります。裏を返せばはっきりしなければどうにもならないということですが。

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

その他の回答 (7)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.7

実例をひとつだけ示していただいたのはいいのだけれど、質問のと書式が違ってるので・・・。 とりあえず後者での場合 ********************************************************************************** #!/usr/bin/perl my @aDT; ## データ処理 while(<DATA>){ if(/.*: (\*[^,]+), \(.*\/([^\/]+),([^\)]+)\): (.+)$/){ push(@aDT,$1."\t".$2."\t".$3."\t".$4); ## タブ区切りで4データ抽出:配列に格納 } } ## 抽出結果表示 foreach(@aDT){ print $_."\n"; } exit; ## ---------------------------------------------------------------------------- __END__ Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd1.txt,1|0): Error_contents Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd2.txt,1|0): Error_contents Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd3.txt,1|0): Error_contents ********************************************************************************** こんな感じでいいのかな?

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

#5 とおよそ同じだけど, 自分なら /^.*?:\s*(.*?),\s*\(.*/(.*?),\s*(.*?)\):\s*(.*)/ くらいかなぁと思う. いずれにしろ「データ要件がよくわからない」には完全に同意>#5.

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.5

大分変わっている気もしますが・・・ https://ideone.com/WzlVE やっぱりデータ要件がよくわからないので、自分のお手伝いはこれで最後にさせて下さい。 適当に正規表現弄ればなんとかなるフォーマットだと思います。

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

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

ま、ヒント程度に。 ○や△の部分が、AからZの大文字、aからzの小文字、0から9の組み合わせでできているとして、 それ以外の *○ △ /△/△/△/△/○.txt, ○|○): ○ / や | などが区切りだと仮定します。 ○や△の部分を取り出すには、この区切りで細かく分けるかその反対に ○や△を構成する文字が並んでいる部分を取り出すという手段があります。 use strict; use warnings; use v5.10; while (my $line = <>) { chomp $line; my @fields = $line =~ m{([^*/ ,.|):]+)}g; say join('::', @fields[0, 6, 7, 8, 9, 10]); } ↑では、後者の○や△を構成する文字の並びを取り出すやり方を採用しています。 で、 use strict; use warnings; use v5.10; sub choice { my $len = shift; my @chars = ('A'..'Z', 'a'..'z', '0'..'9'); use List::Util qw(reduce); no warnings 'once'; reduce {$a . $chars[rand(scalar @chars)]} "", 1 .. $len; } srand; for (1..10) { printf "*%s %s /%s/%s/%s/%s/%s.txt, %s|%s): %s\n", choice(7), choice(7), choice(5), choice(5), choice(5), choice(5), choice(5), choice(6), choice(6), choice(7); } てなので適当にサンプルデータを生成しておいて、先ほどのスクリプトに食わせると QHfb0ss::Tsb7M::txt::twwlsU::NxywFe::Gh9WgFP rJUX2D6::L4FZv::txt::xzQdjG::nAC17q::ON6FTPS Nv6QFu3::OyAvi::txt::a8c57z::jBE2Qc::zcSQtF5 9U1YhE1::OVgbd::txt::6xm4VY::2Ik5T6::xk1C0RE CYKDw1Q::EpdJ0::txt::X3NEB0::v0VEe1::Nnlhx1K HTXfb2L::tAcLA::txt::B4HRJw::Pbuvtj::KFTc00B 0lQKJwQ::wS9RZ::txt::CeK6TM::Gye3oG::ED9WNZ3 xP0OfgZ::BGsab::txt::RBT9eh::3umpt2::uKN9nBF m44tOGk::hkG40::txt::PN1pVT::Hd4pqH::CpCuFRt cN78S6W::Al4Fc::txt::uffj4Z::nKgwtu::kpYaKEX こんな結果が得られます。 txt はいらないので、 say join('::', @fields[0, 6, 7, 8, 9, 10]); で出力している内容を調整します。 今回は区切りに:: を使いましたが、csvにしたければ適当に調節してください。 ここからさらに行と列を入れ替えなければなりませんが、それは宿題にします。 それこそExcelで簡単にできますし。 #2003以前だと256列という制限がありますが無視

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

ここまで他の方々が指摘されているように、元データが曖昧なままだと曖昧な回答しか出てこないと思います。 例えば「任意の文字列」という表現がありますが、ここでいう文字列が[A-Za-z]を指しているというのは実際問題かなり危険な決め付けになったりします。 そもそも「文字列」というのがプログラム言語側の型を指す用語にも出てくるので、避けたほうがいいかもしれません。 * マルチバイト文字が含まれるのか * 記号を含むとしたとき、「,」が含まれるのか 等も気になる部分ですね 実際のデータ形式に酷似したサンプル行と、そこから導いてほしい結果のCSVをなるべく多く載せましょう。 サンプルを作るのは面倒かもしれませんが、これがないとテストも出来ません。 Excelでの作業まで考えられたということは、処理言語はなんでもいいと言うことですよね? 後これは問題ないと思うのですが、行と列が質問文途中で逆転したりはしてないですよね? <おまけ> 等々並べましたが、Perl自体は自分も詳しくありません。 動き確認目的ですが、処理の意図としてはこういう事でいいんでしょうか? (input:とoutput:を比較してみてください) http://ideone.com/AGK21

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

xnilix
質問者

補足

返信が遅くなり大変申し訳ありません。 また、説明不足大変申し訳ありません。 以下に、今回Perlを用いて整理しようとしているデータを詳しく示したいと思います。 Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd.txt,1|0): Error_contents 上記のようなデータが1000行分あると思っていただいて構いません。 上記で取り出したいと思っているものは、 ・*Error ・ddd.txt ・1|0 ・Error_contents の4つとなります。 この4つをcsvファイルで取り出していきたいのです。 またzzzzやxxxxなどは各行によって変わります。 以上、もしお時間がありましたら回答のほうよろしくおねがいします。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

> ○,△:任意の数字、または文字列です。 ○と△の違いって何? わざわざ分けているんだから明確な相違点があるんだろうけど、肝心の相違点が書かれていないので分別しろといわれても無理。 抽象化したんならその条件も書いてくんないと具体例もなしにどうしたらいいんでしょうかって言われても、どうしてよいものやら・・・。 ○が4つって書いてるのに、書式には5つあるし・・・。 具体的な例をだすとか、抽象化の条件を提示するとかをしないとエスパーでもない限り回答するのは不可能かと思います。 まさか○と△って抽象化してるんじゃなくてそのままってことはないですよね?

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

xnilix
質問者

補足

返信が遅くなり大変申し訳ありません。 また、説明不足大変申し訳ありません。 以下に、今回Perlを用いて整理しようとしているデータを詳しく示したいと思います。 Error_check: *Error, (/mmmm/xxxx/yyyy/zzzz/aaa/bbb/ccc/ddd.txt,1|0): Error_contents 上記のようなデータが1000行分あると思っていただいて構いません。 上記で取り出したいと思っているものは、 ・*Error ・ddd.txt ・1|0 ・Error_contents の4つとなります。 この4つをcsvファイルで取り出していきたいのです。 またzzzzやxxxxなどは各行によって変わります。 以上、もしお時間がありましたら回答のほうよろしくおねがいします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「○」とか「△」とかによる.

xnilix
質問者

お礼

お礼が遅れて申し訳ございません。 無事解決することが出来ました。 ありがとうございます。

xnilix
質問者

補足

説明不足で申し訳ございません。 データは1000行分あるのですが、データによって"○"や"△"の値は異なります。 ○や△は例えば、test001のように文字列と数字が組み合わさったものと考えていただいて結構です。