アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、Perlを用いてtxtファイルから必要なデータだけを取り出し、それをcsv
ファイルに出力したいと考えております。
Perlはほとんど触ったことがなく、色々と勉強しながら行っているのですが、期
日が迫っているという事情もあり質問させていただきます。
txtファイルには以下のような文が1000行ほどあります。

*○ △ /△/△/△/△/○.txt, ○|○): ○
○,△:任意の数字、または文字列です。

この内、"○"のものだけを一つ一つ分けてcsvに出力したいのです。
つまり○は4つありますが、出力する際は1つ目の"○"を1行目に、2つ目の"○"を2行
目にといった形にしたいです。
そして、それが1000列分あるということになります。
上手く△のものだけを除外し、○だけを抽出する方法はあるでしょうか?
どなたかよい方法をご存知のかたいらっしゃいましたら、教えていただけると幸
いです。
エクセルで行うということも考えましたが、htmlファイルが入力ファイルとなる可能性もあるためPerlで行うことにしました。

A 回答 (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もそうだったりして?)


いずれにしても、どういった書式のデータがくるのかがはっきりわかれば他の方がいろいろ例を出しているように
書きようはあります。裏を返せばはっきりしなければどうにもならないということですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:09

実例をひとつだけ示していただいたのはいいのだけれど、質問のと書式が違ってるので・・・。


とりあえず後者での場合
**********************************************************************************
#!/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

**********************************************************************************
こんな感じでいいのかな?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:09

#5 とおよそ同じだけど, 自分なら


/^.*?:\s*(.*?),\s*\(.*/(.*?),\s*(.*?)\):\s*(.*)/
くらいかなぁと思う.

いずれにしろ「データ要件がよくわからない」には完全に同意>#5.
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:09

大分変わっている気もしますが・・・



https://ideone.com/WzlVE

やっぱりデータ要件がよくわからないので、自分のお手伝いはこれで最後にさせて下さい。
適当に正規表現弄ればなんとかなるフォーマットだと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:08

ま、ヒント程度に。



○や△の部分が、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列という制限がありますが無視
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:08

ここまで他の方々が指摘されているように、元データが曖昧なままだと曖昧な回答しか出てこないと思います。



例えば「任意の文字列」という表現がありますが、ここでいう文字列が[A-Za-z]を指しているというのは実際問題かなり危険な決め付けになったりします。
そもそも「文字列」というのがプログラム言語側の型を指す用語にも出てくるので、避けたほうがいいかもしれません。

* マルチバイト文字が含まれるのか
* 記号を含むとしたとき、「,」が含まれるのか
等も気になる部分ですね

実際のデータ形式に酷似したサンプル行と、そこから導いてほしい結果のCSVをなるべく多く載せましょう。
サンプルを作るのは面倒かもしれませんが、これがないとテストも出来ません。

Excelでの作業まで考えられたということは、処理言語はなんでもいいと言うことですよね?

後これは問題ないと思うのですが、行と列が質問文途中で逆転したりはしてないですよね?

<おまけ>
等々並べましたが、Perl自体は自分も詳しくありません。
動き確認目的ですが、処理の意図としてはこういう事でいいんでしょうか?
(input:とoutput:を比較してみてください)

http://ideone.com/AGK21

この回答への補足

返信が遅くなり大変申し訳ありません。
また、説明不足大変申し訳ありません。
以下に、今回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などは各行によって変わります。

以上、もしお時間がありましたら回答のほうよろしくおねがいします。

補足日時:2011/08/07 21:11
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:08

> ○,△:任意の数字、または文字列です。


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

この回答への補足

返信が遅くなり大変申し訳ありません。
また、説明不足大変申し訳ありません。
以下に、今回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などは各行によって変わります。

以上、もしお時間がありましたら回答のほうよろしくおねがいします。

補足日時:2011/08/07 21:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:07

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

この回答への補足

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

補足日時:2011/08/03 08:05
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/01 17:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!