あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

過去のカテゴリをまとめて変換するスクリプト

 前に、はてなダイアリーでカテゴリを後から簡単に変えられるツール - あんにんにっき。 という記事でカテゴリを簡単に変えられないものか、と書いたのだが、どうも思ったようなツールが見つからないので作ってみた。
 とはいえ、全部作るのは大変(無理)なので、ありものを組み合わせる方針で。使わせていただくのは以下の二つ。
 はてなダイアリーライター(略称:はてダラ)
 2004-08-20 - 児童小銃
 はてなの管理画面から、その他の機能を選択し、CSV形式で日記データをダウンロードした後、csv2hw.plを使ってはてダラ形式に変換。しかる後に、以下のスクリプトでもってタイトルのみを一つのファイルにまとめてしまう。
 注意:タイトルが *数字*[カテゴリ] タイトル って書式で始まっている想定。いわゆるブログモードって方式。

#!user/bin/perl
use strict;
@ARGV = grep { /^\d\d\d\d-\d\d-\d\d\.txt$/} glob("*.txt");
open FH ,'>titlelist.txt';
while(<>){
	chomp;
	print FH "$_\n" if /^\*\d+\*/;
}
close FH;

 これで、titlelist.txtというファイルが生成される。これをエディタで開いて、タイトルのカテゴリ部分を置換なりなんなりで一括変換したり、タイトル眺めながら適当なカテゴリを付けてみたりする。
 とりあえず、テストとして[日]ってのを[日記]と一括置換してみた。
 しかるのち、今度は以下のスクリプトでもって、元のはてダラ形式ファイルに書き戻す(変更分のみ)。

#!/usr/bin/perl
use strict;
my %title_list;
my $key; 
my $title;
my $isWrite;
my $filename;

# タイトルデータ読み込み
open FH, '<titlelist.txt';
while(<FH>){
	chomp;
	($key) = /(^\*\d+\*)(.*$)/;
	$title_list{$key} = "$_";
	print "$key\n";
}
close FH;

print "\n---------\n\n";

# 日記ファイル読み込み+書き出し
my @files = grep{/^\d{4}-\d{2}-\d{2}\.txt$/} glob ("*.txt");
for (@files){
	$filename = $_;
	open DIARY, "<$filename" or die "Cannot open diary file $!";
	open WORK, "> work.txt" or die "Cannot create work file $!";
	$isWrite = 0;
	while(<DIARY>){
		chomp;
		($key,$title) = /(^\*\d+\*)(.*$)/;
		if (defined($title_list{$key})){
			print WORK "$title_list{$key}\n";
			if ($title_list{$key} ne $_){
				$isWrite = 1;
			}
		}
		else{
			print WORK "$_\n";
		}
	}
	close DIARY;
	close WORK;

	print "check $filename & $isWrite\n";

	if ($isWrite){
		rename "$filename", "$filename.bak";
		rename "work.txt", "$filename";
	}
}

 しかる後、はてダラにて、はてなに書き戻しをかける。すると、書き変えたカテゴリだけはてなダイアリーに反映されていると。
 少々使い勝手が悪く、完成度は低いものの、個人的目的を果たす分には十分なのでこれで良しとしよう。
 絶対になんかもっとうまくて簡潔な書き方がありそうな気がするのだけど。
 とりあえず、後で見返したとき自分の進歩がわかるように(進歩しててくれ、未来の自分)公開しておこう。
 ここ見てくれた方で、この本を読んで勉強しなおした方がいいよ、とかこうしたらもっと簡潔に書けるよ、とかアドバイスあればコメント等で教えてくだされば助かります。