perlでエクセルを読む

2020/6/23 [09:00:24] (火) 天気

WINDOWSのActive perlでSpreadsheet、ParseExcel、ParseXLSXを使ってエクセルを読んで作業したのでメモ。


複数のフォルダに入っている、複数のエクセルファイル。

フォルダ名は五十音のひらがな。あかさたな~ってやつ。

ファイル名は日本語だったり乱数だったり、中身とはほぼ関係もなく意味不明なファイル名となっている。


エクセルファイルの特定箇所を確認して、別途登録されているものと違っていたら修正。

エクセルのファイル名を登録されているもの(日本語)にリネーム。


ざっくり、てな作業。

ひとつずつエクセルを開いて、ひとつずつ確認する、なんて手作業はやってられない。作業前から、見逃す・リネームを間違えるのが目に浮かぶようだ。


一覧表を作って確認して、そこから修正すべきものだけコピペする方が早くて確実。


エクセルファイルは「.xls」なので、使うのはSpreadsheet::ParseExcel

エクセルファイルを読み込んで、エクセルのファイル名と該当セルに記載されている名前をタブ区切りで出力するだけのスクリプトになる。



use strict;
use utf8;
use Encode;
use Spreadsheet::ParseExcel;

my $f = shift(@ARGV);
my $fname = Encode::decode(’cp932’, $f);
$fname =~ s!\\!\t!g; $fname =~ s!^.+\t([^\t])\t([^\t]+)$!$1\t$2!;
print Encode::encode(’cp932’,$fname) . "\t";

my $p = Spreadsheet::ParseExcel->new();
my $e = $p->parse($f);
if (! defined $e ){ print "!!!ERROR!!!\n"; exit;}
my $cnt;
for my $sheet($e->worksheets()){
    last if ++$cnt > 1;
    my $cell = $sheet->get_cell(2,2);
    my $c = $cell->value(); $c =~ s!^[\t  ]+!!;
    print Encode::encode(’cp932’,$c);
    print "\n"
}


確認が必要なのは1枚目のシートにある3行目C列のセル内容

get_cell(2,2)で該当セル情報を取得(perlは0からなので3番目は2)

セル情報がHASHで入っている。必要なのは値なのでvalueで取得する。


取得する値はutfフラグ付きの日本語になるのでcp932(WINDOWSの文字コード)にして出力。


ここで気づかれると思うけど、このスクリプトは、複数のファイルを一度に処理するようにはできてない。引数に渡されたひとつのエクセルファイルを処理するだけ。


perlにはopendirがあるし、ファイル一覧を取得してループでSpreadsheet::ParseExcelに読み込ませるのが綺麗で正しいやり方。だけど、日本語フォルダ名、日本語ファイル名がうまく渡せない、読み込めなくてハマった。

たぶん文字コードの問題。utfフラグをつけてみたり何もしないまま渡してみたりしたんだけど、どうもうまくいかない。時間もあまりない。


そこでわたしの得意な現物合わせのやっつけ仕事の出番。

よくわかってない人間が間に入るからダメなわけで、だったら機械同士、ソフトウエア同士で直接やりとりしてもらおうとバッチファイルにした。



@echo off
for /r %%f in (*.xls) do (
    echo %%f
    perl parse-excel.pl "%%f" >> _list.tsv
)
pause:


バッチファイルの for 文で /r をつけると再帰でサブディレクトリも拾ってくれるなんて、今回初めて知った。


このバッチファイルでperlにファイル名を渡すとエラーもなく意図通り読み込んでくれるようになった。いや、上記したように、本当だったらperlだけで済むはずなので、綺麗な解決方法じゃないけど、結果オーライ、だ。


出力されたtsv(タブ区切りファイル)を新しいエクセルに貼りつけ、別途正しい登録名を貼りつけ一覧表を作成する。

そうしたら、エクセルお得意のvlookupでエクセルの該当箇所と正しい登録名の相違を確認。登録名と違っているファイルだけ開いて該当セルを修正する。


また、修正作業には登録名をコピるのでついでに一覧表も修正。

エクセルのファイル名と登録名がこの一覧表の「.xlsx」ファイルに記載されることになるので、Spreadseet::ParseXLSXを使って読み込み、一括でリネームするようにした。



use strict;
use utf8;
use Encode;
use Spreadsheet::ParseXLSX;

my $f = ’_work2.xlsx’;
my $fixed = ’_fixed’;

opendir(DIR,’.’) || die;
my @dirs = grep(!/^\./ && -d $_, readdir(DIR));
closedir(DIR);

if(! -d $fixed ){
    mkdir $fixed;
    foreach my $d (@dirs){
        mkdir $fixed .’/’. $d;
    }
}

my $p = Spreadsheet::ParseXLSX->new();
my $e = $p->parse($f);
if (! defined $e ){ print "!!!ERROR!!!\n"; exit;}
my $cnt;
for my $sheet($e->worksheets()){
    last if ++$cnt > 1;
    my $row; my $col;
    ($row->{min}, $row->{max}) = $sheet->row_range();
    ($col->{min}, $col->{max}) = $sheet->col_range();
    for my $i (1..$row->{max}){
        my $fname0 = $sheet->get_cell($i,4); 
        my $fname1 = $sheet->get_cell($i,1);
        my $dname  = $sheet->get_cell($i,3);
        last if (! defined($fname0));
        if($fname1->value() =~ m!N/A!){
            $fname1 = $sheet->get_cell($i,2);
        }
        if(! defined($fname1)){
            print $fname0->value() . "\n";
        }
        else{
            my $cmd = sprintf qq{copy %s\\"%s" %s\\%s\\%s.xls\n}, $dname->value(), $fname0->value(), $fixed, $dname->value(), $fname1->value();
            print Encode::encode(’cp932’, $cmd);
            system(Encode::encode(’cp932’, $cmd));
        }
    }
}


row_range()とcol_range()でシートに記載されている行数とカラム数を取得してループさせて全部読み込ませる。また、vlookupで N/A になっているところは正しい登録名を別セルに記載したので、そちらを読むようにさせた。


ここでもperlだけでリネームはできるんだけど、なんせ日本語のフォルダ名とファイル名。またうまくいかなかったら面倒くさいんで、perlでリネームするのではなく、system関数を使ってWINDOWSに仕事をさせることにした。


といいつつ、リネームは怖いので、別フォルダに同じディレクトリ構成で登録名ファイルをコピーすることにした小心者だ。


日本語のファイル名は見た目分かりやすいけど、スクリプトで扱うのはただただ面倒くさい。

それに、そもそもなことを言っちゃうと。

ファイル名や入力項目などなど、表記の揺れレベルじゃない間違いは、依頼する時点で入力するひとのことを考えて何か仕組みを作らないといかんよなあ。


あ。もうひとつ。

目grep手merge撲滅!ひとのやる手作業を信用しちゃいけない。


image

ポケモンGo:新ジム戦がめっちゃ面白くなってた

2017/6/23 [16:43:35] (金) 天気

ポケモンGoが一周年を前に大型アップデート。ジムの仕様ががらっと変わって、今日6/23(金)にリニューアルオープンした。


今までは、ポケモンはCPの高い順に配置されて、どのジムも同じポケモンばかり、カイリューだらけハピナスだらけの金太郎飴。

今度はCP関係なく、用意された6つ空スロットに配置した早いもの順。さらに違う点としては、同じ種類のポケモンが配置できなくなった。カイリューが先に配置されていたらカイリューを配置することはできない。


ジム戦をすると6匹6種類のポケモンとバトルすることになる。

今までのようにカイリュー対策だけ、ハピナス対策だけ考えてラインナップというわけにはいかない、かな。実際、最近ほとんどジムで見なかったポケモン、サンダースやウインディ、リザードン、ラプラスなんかが配置されていた。


ポケモンのタイプや技、相性を考えるのが、今まで以上に面白い。

今回のアップデートで「効果抜群」とか「効果はいまひとつ」とかのダメージボーナスが変更になり、ボーナス特典が増えているとのこと。

カイリューでジム攻めしていてラプラスがいたら別のポケモンにしよう、ということにもなる。

(二重弱点を持つ、カイリュー・バンギラス・ギャラドス・サイドンなんかの使いかたがちょっと面倒になる)


このスクリーンショットは、まだカイリュー、バンギラスなどレガシーなメンツだけど、今後はいろんなラインナップのジムが増えそうだなあ。楽しみ。

image


[06/23 19:17:48]

とはいえ。事務防衛ポケモンが弱体化してるような気がするなあ。「やる気」を削ってCPが下がると顕著。「やる気」がマンタンの一周目はともかく二周目以降がショボイかも。3周目ともなるとシャワーズ一体で6体抜きができちゃうんで、タイプ相性が関係なくなるぞ…ここんとこ調整入ってくれんかな。

ポケモンGo:大型アップデート直前

2017/6/23 [00:20:33] (金) 天気

ジムに関して大型アップデートが予定されていて、今日現在ジムが閉鎖されて準備中となっている。ジムにアクセスできなくて、もちろんジム戦ができない状態だ。リニューアルオープンは7月上旬らしい。

いろいろ仕様が変わるようで、今までのジム戦とはまったく違うものになりそう。

詳しくはポケモンGo公式サイト http://www.pokemongo.jp/topics/67/ か、そのへんの攻略サイトで確認して予習をしておこう。


実際どんなことになるのかわからないので、アイテムを捨てるわけにもいかず、砂や飴を消費するわけにもいかず…って、ポケモンGoができない状態でもある。

なので、自分の現状を眺めるぐらいしかやることがない。


トレーナーレベル:35


【図鑑】

見つけた数236。捕まえた数230。

第一世代は地域限定ポケモン以外の実装されているポケモンはコンプリート。あ!金のコイキング、赤のギャラドスがまだだった。

第二世代は地域限定ポケモンと180モココ、181デンリュウ、201アンノーンがまだ殘ってる。

メリープはいるので、進化形のモココ・デンリュウは、相棒にして連れ歩けばなんとかなるにしても、卵から出ないアンノーンは無理くさいなあ。


【メダル】

残る金メダルは5つ。

巨大なコイキング、小さいサイズのコラッタ、ピカチュウ、はがねタイプの捕獲、ドラゴンタイプの捕獲。

これはやってりゃそのうち金メダルになるんだろうと思う。

(大型アップデートでメダルの新規追加も予定されていて、これで全部じゃないけど)


ちなみにジョギングメダル(歩いた距離)は2635キロ。Ingressでは3242キロ歩いてる。ナイアンティックのゲームで6000キロ弱歩いてることになるんだなぁ。メタボな数値が軒並正常値になるわけだ。


【ポケモンボックス】

課金して500まで拡張。今のところ381匹いる。

そのうちCP3000超はカビゴン3匹、カイリュー、ギャラドス2匹、ハピナス1匹。

CPについては、大型アップデート後のジム戦ではあまり重要ではなくなる、という噂。

ポケモンを育成強化するのが面白いゲームでもあるので、今後どうなるのか知りたいけど、実際にアップデートされてみないとわからないところ。ジムにはユーザーがポケモンを配置する、いわばユーザーがゲームを作る部分なので、アップデート後のユーザーの動向次第。どのポケモン・タイプ・技が重要になってくるのか、まったくわからない。


わかっていることとしては、これからはジムに6匹、各1種類しか置けなくなって、今まであまり出番のなかったポケモンも並ぶことになるから戦闘のバリエーションが増えてちょっと楽しみ。


image


[06/23 07:05:29]

…って、今ポケモンGOを立ち上げてみたら、ジム解禁になってるじゃん。さっそく後でいってみよう。

人妻・熟女ものが増えたワケ

2014/6/23 [17:29:11] (月) 天気

twitterで見かける、今回の児ポ法の影響で萎縮・自主規制の結果、(安全な)人妻・熟女ものが増えたという話。

もちろん「今回の」児ポ法の影響はあってしかるべきだけど、今に始まったことじゃない・「今回」の法案が決定的な要因ではないだろう。


わたしがエロ漫画編集をやっていた当初の頃からだから、もう30年ほど前から、児童や聖職者(教師、看護婦、警官など)、近親者を対象としたエロ漫画だったり、犯罪を想起させる漫画(ひとコマの中でナイフと顔が一緒に並ぶとかの描写も含めて)は都条例の指定対象となっていた。当時からこの手のテーマ、ストーリー、描写は自主規制してきた。

表現の自由とか言うとよくわからないし面倒くさいことがもろもろあるんだけど、これ描いたら指定されて次はない、という生活のかかった実感のあるところでのやりとりを都庁で(ありがたくないんだけど)頻繁にしていた。

(宮崎事件でいろいろなことが決定的に変わってしまったと思ってんだけど、昔からここはうまくまとまらないので黙っておこう)


なので「今回の」児ポ法が原因と決めつけてしまっては他にあるかもしれない要因が見えなくなってしまわないかと思ってしまう。


人妻・熟女ものが増えたのは、ロリ自主規制よりももしかすると

「エロ本業界の厳しすぎる現状について書きました」-ダリブロ 安田理央Blog

現在のエロ本の読者は40~50代でネットが出来ない人が大半


こっちの方が人妻・熟女ものが増えた理由になってるような気がする。

エロ漫画、エロ本で抜いていたのがたぶんこの通り40代〜50代だろう…まさにわたしがそうなんだけど。となるとその対象はやっぱりそのぐらいの年齢まで広がるもので「売れるから」人妻・熟女ものが増えた、というのが正解だと思ってる。


雑誌などの紙媒体じゃないけど。動画配信サイトなどでも「熟女」「人妻」は売れるジャンル。ネットができるできないに関わらず、人妻・熟女は売れる時代になったということかも。


少子高齢化。これからの日本は徐々に黄昏の世界に入っていくんだろうなあ、という感想で終了します。


[更新]2026-02-01 12:47:28

ローカルHTMLを表示するだけのiOSアプリ

2013/6/23 [19:45:50] (日) 天気

UIWebViewというのがある。

これを使えば、iOSアプリ(iPhoneやiPad)で簡単にHTMLを読み込んで表示してくれる。ローカルにおいたHTMLも同じく。


ということで、ガワさえ作ってしまえば、中身はHTMLとCSSで頑張ればアプリっぽいものができる。というかほぼまんまWEBの再現が可能。とはいえ、この程度のシロモノがapp storeの審査を通るとはとても思えないので「AD-HOC配布で野良アプリ」もしくは「専用端末化したiOSデバイスにプリインストールして配布」というのが使いどころだろう。


とりあえずこのローカルHTMLを読むアプリは、ド素人、超初心者でも作れるiOSアプリということで、Xcode 最初の1歩としては(わたしのような素人には)ちょうどいい練習問題っぽい。


・Xcodeを立ち上げる。

↓新規作成する

↓「Single View Application」を選択

↓「Product Name」「Organization Name」「Company Identifier」など適当に

 ※ Storyboardsがよくわからないので、チェックを外しておいた。

↓プロジェクトフォルダを作成する

・デフォルトのシンプルな設定でXcodeが立ち上がる。


ソースを2つ編集する。


ViewController.h の @interface の行の下に追加。

(WEB表示オブジェクト(?)はwviewという名前ですよと設定・宣言する)


{
    @private
    IBOutlet UIWebView* wview;
}


ViewController.m の viewDidLoad の中に LoadRequestうんぬんの行を追加。


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [wview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"index"] ofType:@"html"]isDirectory:NO]]];
}

プロジェクトフォルダの中のResourceフォルダを探して、そこにあるindex.htmlを読み込んで表示しますよ、ということなので、Resource フォルダを作ってそこにHTMLやCSS、画像などを入れるようにする。


Xcodeでプロジェクトフォルダを右クリックして「Add Files to "SAMPLE"」(SAMPLEはプロジェクト名)でリソース用のHTMLなどが入ったフォルダを追加する。

※ この時、HTMLの中から相対パスで画像などを指定できるように「Create folder references for any add folders」にチェックを入れる。


Xcode の便利だけど面倒くさいのが画面設計。UIが良く出来ていて、部品をドラッグアンドドロップするだけでそれっぽい見た目のできあがり。


ViewController_iPhone.xib をクリックするとiPhoneのモックアップ(?)が現れる。

とりあえず表示するだけなら、そこにWebViewオブジェクトをドラッグアンドドロップ(このWebViewオブジェクトの中にHTMLが表示されることになる)すれば完成。

あとは、シミュレーターにiPhoneを指定して、「Run」するだけ。


以下は、index.htmlに戻るとかリロードなどのコントロールをつけたもの。

image

コントロールをつけるとなると、とたんに考えることがいろいろ増えるので試行錯誤で大騒ぎ・大変。なかなか思うようにいかない…けど、今日のところは終了、続きはまた明日以降。もう初老だ。7時間程度ぐらいしか続かない。


・画面・レイアウト設計

・ソースコードの編集

・画面レイアウトされたオブジェクトをソースコードの該当するところに紐づける


大雑把に、XcodeでのiOSアプリの作成はこの3つかな。


Xcodeのソースについて調べていて。バージョンごとで書き方がけっこう違うんで、混乱。基礎からきちんと訓練を受けたプログラマならすぐに解決だろうなあと、うらやましい。

[更新]2026-02-01 15:26:54

<<2026/06>>
 123456
78910111213
14151617181920
21222324252627
282930

【最近の10件】

日常読書映画アニメゲーム健康料理グルメカメラ写真ネタ仕事パソコンインターネットperlEPUB3電子書籍ActivityPub
検索: