読者です 読者をやめる 読者になる 読者になる

はてなのCSV形式エクスポートデータをXML形式に変換するスクリプトを作ったけどうまくインポートできませんでした

はてな

なんでそんなものが必要なのかというと、インポートしたい記事がCSV形式でしか手元に残ってなかったから。で、Rubyでひょひょいとスクリプト書いてXML形式にしてみたけどインポートできてないみたいだ。うーん。

というか、[インポート]ボタン押しても「日記の読み込みを開始しました云々」と表示されるだけで、結局インポートがうまくいったのかいってないのか、それとも処理に時間がかかっているだけなのか何なのか全くわからないので困る。

しかたなく記事一覧から該当記事がインポートされているかどうかF5連打しながらチェックしたり。でも見つからないってことはたぶん失敗してるんだろうなぁ。

スクリプトでの変換がうまくいってない可能性はすごくある。でもとりあえずはてなダイアリー日記データ用 XML Schemaを使ってValidなことは確認はした。

うーんうーん。今日は寝る。

スクリプトは↓な感じ。

#!/usr/bin/ruby

#
# はてなダイアリーCSV形式エクスポートデータをXML形式に変換する
# 2008/09/18 written by ymkn ( http://d.hatena.ne.jp/ymkn/ )
#
# 使い方:
# 1. このスクリプトをUTF-8で保存する (ex. h_csv2xml.rb)
# 2. 読み込むCSVデータをUTF-8に変換しておく (ex. hatena_utf8.csv)
# 3. ruby h_csv2xml.rb < hatena_utf8.csv > hatena_utf8.xml
#

require 'csv'
require 'rexml/document'

doc = REXML::Document.new
doc << REXML::XMLDecl.new('1.0', 'UTF-8') 

diary = doc.add_element('diary') 

csv = STDIN.read

CSV.parse(csv) do |row|
  day = diary.add_element('day', {'date' => row[0], 'title' => row[1]})
  day.add_element('body').add_text(row[2])
  unless row[3] == nil
    comments = day.add_element('comments')
      row[3].split("\n").each do |c|
        /^(.+?)『(.+?)』/ === c
        comment = comments.add_element('comment')
        comment.add_element('username').add_text($1)
        comment.add_element('body').add_text($2)
        
        # CSV形式にはコメントのtimestampが含まれていないので、日記の日付で代用する
        t = row[0].split('-')
        comment.add_element('timestamp').add_text(Time.local(t[0], t[1], t[2]).to_i.to_s)
      end
  end
end

doc.write STDOUT

2008/09/19追記

はてなのエクスポート機能で生成したXMLのBody要素は はてな記法形式だった。翻ってCSVは整形後のHTMLタグ込み込みである。HTMLからはてな記法に戻すのはとても大変(面倒)なので力尽きた。そこまで苦労してインポートしたいデータでもないし。

あと、明らかに間違ったXML形式をインポートに渡すと、「XMLが違う」的メッセージが表示された。てことは、上のスクリプトで生成したXMLははてなのXML的にはあっているのにインポートされてないということ。もうわけわからん。