2018年02月04日

Perlで特定行から特定行までを抜き出したい(リストコンテキスト)

Perlで特定行から特定行までを抜き出したいことがあったのでメモ
要するに以下のテキストデータがあった場合
---------------------------------------
【OP1】
aaaaaa
bbbbbb
【OP2】
cccccc
dddddd
【OP3】
1234557
【OP1】
eeeeee
ffffff
【OP2】
ggggggg
hhhhhhh
【OP3】
0000000
以下似たよようなデータの繰り返し
---------------------------------------
【OP1】〜【OP2】に挟まれているデータを抽出したいことがある
その場合には

#【OP1】〜【OP2】まで抽出
#my ($Address)としているのはリストコンテキストで代入するため
#my $Addressだとスカラーコンテキストになるのでだめです
#my ($Address) = $Content =~ /(【OP1】.+【OP2】)/s;

とすることで$Addressに【OP1】.+【OP2】のデータが入る。
ここでキモなのはリストコンテキストの代入となるカッコ付で代入しないとだめである
posted by トシ at 20:10| Comment(0) | Perl

Perl:1つの変数に複数行を入れる

Perlには2つの
スカラーコンテキスト
リストコンテキスト
という、概念が存在する
特にCSVやhtmlスクレイピングを行うときにいろいろ使ったりする。
CSVファイルを読み込むときに1行ずつ(改行毎に)読み込んで色々な処理を行うことがある(スカラーコンテキスト)。でも、正規表現を使用して一気に置換や抽出を行う場合には1つの変数に複数行を入れる(リストコンテキスト)の方がつごうが良い場合がある。
その際に、perlで強制的にリストコンテキストを作る方法が以下の通りである


for (0..@all_files-1){
#ファイルの内部ループ
#入力ファイルが漢字(cp932)の場合そのまま出力すれば漢字(cp932)指定になる(encode/decodeなしでもOK)
open (my $OPTION, "<$all_files[$_]" ) or die "$!";

#1行ごとのテキストデータをまとめて1つの変数に突っ込む
#「$/」は特殊変数で、改行区切りを一時的に無効にする
my $Content = do { local $/; decode('sjis',<$OPTION>) };
}

posted by トシ at 19:58| Comment(0) | Perl

2018年01月21日

PDFからテキスト抽出(windows) Xpdf使用

現在の仕事での悩み・・・
・PDFで保存された定型フォーマットの資料が数千枚ある
・その資料の中には文字や日付、型番が入っている
・そこからデータを解析したい(例えば日付毎に何が売れているのか、その傾向はとか)

そのためにはまず、連続して「Pdfからテキスト抽出」が出来ないことには
先に進まないので、「PerlでPdfからテキスト抽出」を考えていたのだけど。
調べると、Perlからテキスト文字をPDF化という

○テキスト→PDF
という記事は多かったけど
○PDF→テキスト
という記事が探しきれなかった

PDF::API2を使えば抽出出来そうだけど。結構PDF内部構造を理解しなければならない
そもそも、そんな難しいことを考えずにテキスト化したがったのだが、どんどん難しい方に
進んでしまったので、Perl単独でテキスト化することは諦めて
なんかの外部ツールに任せることにした。

そこで、PDFからテキスト抽出(windows)を考えるとどうやら
コマンドラインでPDFからテキスト抽出できる無料のソフト(というか、コマンド)が入手出来る事が分かった。

コマンドラインベースで使えるフリーのPDF用ユーティリティー
などがあります。細かい説明は(http://pdf-file.nnn2.com/?p=245#tools)が参考になりますが自分で調べた範囲では
Xpdf
最新版はVer4.0だけどバイナリ版は配布されていない。バイナリを使用したい場合には(http://www.filewatcher.com/m/xpdfbin-win-3.04.zip.10794993-0.html)あたりで3.04版を入手する必要がある
Poppler
Xpdfの拡張版(こっちを使うのがよいかも)
なので、Popplerを使って見ることにする


posted by トシ at 11:29| Comment(0) | Perl