今までにはてなブログライター向けに作成したテキストファイルを1つにまとめる方法

以下の記事の続きです。

新しく書く記事を1つのテキストファイル(ここではdiary.txt)から切り出せるようになったので、今度は今までにはてなブログライターで登録したエントリのテキストファイルをdiary.txtにマージしようと思う。

(以下、初出時から書き換えた内容)

はてなブログライターがバージョンアップして、すでにはてなブログへ投稿したエントリもダウンロードしてはてなブログライターで管理できるようになった。

ダウンロードしたエントリファイルを1つにまとめるスクリプトを作った。(「add_blog_header.pl」は使い勝手がよい「hbw_uniter.pl」に差し替えた)

  1. はてなブログライターのあるディレクトリで「hbw_uniter.pl」を実行する
    • ディレクトリ内の「yyyy-mm-dd_nn.txt」というすべてのテキストファイルの冒頭に日付が挿入された上ですべて連結され「united.txt」に出力される。ディレクトリ内にすでに「united.txt」があった場合、それは「united_bak.txt」にリネームされる
  2. 「diary.txt」を別の名前に変更し「united.txt」を「diary.txt」にリネームする

diary.txtを修正して「hbws.pl & hbw.rb」を実行すると、書き換えられた日のエントリだけが更新される。過去の記事も含めて一括置換が可能になった。

以下は以前書いた内容です。「add_blog_header.pl」は「hbw_uniter.pl」に差し替え、手順が簡単になりました。


  1. はてなブログライターのあるディレクトリに「add_blog_header.pl」を置く(内容はこの記事の末尾に)
  2. コマンドプロンプトを開き、はてなブログライターのあるディレクトリで「dir /b ????-??-??_??.txt > dir.bat」を実行
  3. テキストエディタで「dir.bat」を開き、行頭に「perl add_blog_date_header.pl 」を追加(正規表現置換が使えるテキストエディタならば、「^(.)」を「perl add_blog_date_header.pl $1」に置換)。その結果、たとえば「2019-01-01_01.txt」が「perl add_blog_date_header.pl 2019-01-01_01.txt」になればよい
  4. 「dir.bat」を実行。その結果、たとえば「2019-01-01_01.txt」から「a2019-01-01_01.txt」が作られればよい
  5. 「copy /b a*.txt diary_old.txt」を実行。手順4で作られたテキストファイルが連結される
  6. 「diary.txt」の冒頭に「diary_old.txt」の内容をコピー

これでOKです。手順の途中で作られた「a」で始まるテキストファイル群は削除してしまってかまいません。

あとは、はてなブログライターを使わずに直接投稿したエントリをはてなブログライターの管理下に入れることができれば最高なんですが、それはちょっと難しいみたい→http://ima.hatenablog.jp/entry/2018/09/07/120000 の末尾

add_blog_header.plの内容

#! /usr/local/bin/perl

# 引数に書かれたファイル名のファイルを読み込んで処理し出力する(改行をまたぐ置換をするためにすべての行を読み込んで一括処理)
foreach $infilename ( @ARGV ){ #コマンドラインで指定された複数の引数をすべて処理する(引数は@ARGVを通して$infilenameに入る)
	$day = $infilename;
	$outfilename="a" . $infilename; #「a元ファイル名」というファイルに出力

	open(IN,"< $infilename");
	open(OUT,"> $outfilename");
		while (<IN>) { #<IN>に入力されたファイルを処理する
			$out = $out . $_; #いったん全部の行をまとめて入れる(改行を含む置換をしたいから)
		}
		$out = $day . $out;
		$out =~ s|^(\d\d\d\d\-\d\d\-\d\d_\d\d)\.txttitle: ([^\n]+)|$1:$2|;
		$out =~ s|(.+)\n*$|$1\n\n|; #各テキストファイルの末尾に改行を2つ入れて統一
		print OUT $out;
	close IN;
	close OUT;
}

このスクリプトGitHubに公開した。