現在、Perlを用いてtxtファイルから必要なデータだけを取り出し、それをcsv
ファイルに出力したいと考えております。
Perlはほとんど触ったことがなく、色々と勉強しながら行っているのですが、期
日が迫っているという事情もあり質問させていただきます。
txtファイルには以下のような文が1000行ほどあります。
*○ △ /△/△/△/△/○.txt, ○|○): ○
○,△:任意の数字、または文字列です。
この内、"○"のものだけを一つ一つ分けてcsvに出力したいのです。
つまり○は4つありますが、出力する際は1つ目の"○"を1行目に、2つ目の"○"を2行
目にといった形にしたいです。
そして、それが1000列分あるということになります。
上手く△のものだけを除外し、○だけを抽出する方法はあるでしょうか?
どなたかよい方法をご存知のかたいらっしゃいましたら、教えていただけると幸
いです。
エクセルで行うということも考えましたが、htmlファイルが入力ファイルとなる可能性もあるためPerlで行うことにしました。
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もそうだったりして?)
いずれにしても、どういった書式のデータがくるのかがはっきりわかれば他の方がいろいろ例を出しているように
書きようはあります。裏を返せばはっきりしなければどうにもならないということですが。
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
**********************************************************************************
こんな感じでいいのかな?
No.5
- 回答日時:
大分変わっている気もしますが・・・
https://ideone.com/WzlVE
やっぱりデータ要件がよくわからないので、自分のお手伝いはこれで最後にさせて下さい。
適当に正規表現弄ればなんとかなるフォーマットだと思います。
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列という制限がありますが無視
No.3
- 回答日時:
ここまで他の方々が指摘されているように、元データが曖昧なままだと曖昧な回答しか出てこないと思います。
例えば「任意の文字列」という表現がありますが、ここでいう文字列が[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などは各行によって変わります。
以上、もしお時間がありましたら回答のほうよろしくおねがいします。
No.2
- 回答日時:
> ○,△:任意の数字、または文字列です。
○と△の違いって何?
わざわざ分けているんだから明確な相違点があるんだろうけど、肝心の相違点が書かれていないので分別しろといわれても無理。
抽象化したんならその条件も書いてくんないと具体例もなしにどうしたらいいんでしょうかって言われても、どうしてよいものやら・・・。
○が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などは各行によって変わります。
以上、もしお時間がありましたら回答のほうよろしくおねがいします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
Windowsのバッチファイルを利用...
-
エクセルの各セルの内容をそれ...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
renameコマンドについて
-
COPYコマンドで結合すると余計...
-
WinAPI SHGetFileInfoでICONフ...
-
文字演算の動作不良
-
cshでファイルサイズ取得
-
テキスト(txt)→ワード(docx)へ...
-
unlinkで削除されないのは?
-
include文
-
リモートのファイル存在確認
-
VBを使い、テキストをする保存...
-
ファイルの転送について
-
VIVI(エディタ)のスクリプト...
-
ハードディスク上書き用大容量...
-
Teraマクロで取得した変数を編...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
拡張子を元に戻す
-
テキストファイルで提出とは?
-
ファイルの最後に文字列挿入
-
バッチファイル 複数ファイル...
-
バッチファイルで文字列削除に...
-
renameコマンドについて
-
forfilesで検索したファイルを...
-
accessでSQL文を使ってcsvファ...
-
バッチファイルからVBAに引数を...
-
psqlでエラーログをとりたい
-
UWSCでテキストファイルを開い...
-
cshでファイルサイズ取得
-
MS-DOSのバッチファイルの中で...
-
コマンドプロンプトで指定した...
-
テキストファイルのタブをカン...
おすすめ情報