檜山正幸のキマイラ飼育記 このページをアンテナに追加 RSSフィード Twitter

キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
このブログの更新は、Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama
ところで、アーカイブってけっこう便利ですよ。

2013-09-13 (金)

はてなダイアリーのダウンロード・データ

| 17:07 | はてなダイアリーのダウンロード・データを含むブックマーク

ブログは、ちょっとずつ書いてはストックしていくには便利なツールですが、書いたものを整理して取りまとめるのは大変です。

僕の場合、今日の時点でこの「キマイラ飼育記」が、

  • 記事を書いた日数 1827日

メモ編」が、

  • 記事を書いた日数 1118日

で、これを整理するなんて不可能なんではないかと思えます。ですが、とりあえずナンカやってみようと。

なにはともあれダウンロード。はてなダイアリーのダウンロード形式については、既に次の記事に書きました。

複数の形式があるのはケッコウなことなんですが、形式ごとに含まれる情報が違っているんですよね。MT形式では原稿(はてなダイアリー記法テキスト)がなく、XML形式では表示用HTMLがありません。CSVには両方揃ってますが、コメントのタイムスタンプはCSVには入ってません。

どの形式であっても、常に全部一括でダウンロードです。これは困りますね。ある期間に書いた記事とか、タグによるカテゴリーで絞り込んでの部分ダウンロードはできません。部分を抽出したいなら、全部ダウンロードしてから自分でやるしかないのです。

情報としてはMT形式が一番豊富なようですが、原稿が入ってないので僕はXML形式を使うことにしました。僕は日記形式を使っているので、単位は日(day)です。一日に複数のエントリーを書いてもXML的な構造化はしてくれません。エントリーに分割したいなら、これも自分でテキストをパーズするしかありません。

それと、日(day)が単位だと、コメントがどのエントリーに付いたものかが分からないのですよね。これは、コメントがエントリーではなくて、日(day)に付属するというデータ構造なんで仕方ないのですが…

トラックバックの情報は消失するようです。どんなトラックバックがあったかの記録という意味もありますが、自ブログ内における自動トラックバックは、ハイパーリンクによる構造を与えてくれていました。残念ながが削除されます。再現したいなら、バックポインタを自分で付けるしかありません。

メタデータは不足を感じます。編集履歴はいいとしても、created、lastUpdatedの時刻は欲しいです。後から斜め読みする都合からは、summary、abstractのたぐいが欲しくなります。そのようなものを書くメカニズムはないし、あっても使うかはあやしいですけど。

ブログはもともと体系的に書くツールではないので、メタデータや構造が不足しているのは宿命ですが、メタデータや構造を付加する支援がもう少し欲しいなー。合計2945日分のデータを手でいじるのはシンドすぎる。

MongoDBのmongoimportでハマった:変なJSON形式

| 10:34 | MongoDBのmongoimportでハマった:変なJSON形式を含むブックマーク

MongoDBにデータを入れるために、mongoimportというコマンドがあります。使ってみることにしました。

コマンドラインには、データベース名、コレクション名、ファイルの形式、ファイルを指定します。JSON形式のファイルからコレクションにデータをインポートすることにします。

mongoimport --db test --collection a --type json --file data.json

テストに次のような簡単なJSONデータを準備しました。

[
  {"x": 1, "y": 2},
  {"x": 3, "y": 5}
]

Failure parsing JSON string near: [

はぁ? 正しいJSONデータのはずだが? ブラケット('[')でパーズエラーとか言っているので、ブラケットをはずしてみました。

  {"x": 1, "y": 2},
  {"x": 3, "y": 5}

すると、

Failure parsing JSON string near: ,

imported 1 objects
ERROR: encountered 1 error

うーむ、カンマもダメらしい。

  {"x": 1, "y": 2}
  {"x": 3, "y": 5}

これならインポートできます。

しかし、JSONとして正しい配列形式を許さないって、なんなの? 他のシステムが、正しいJSON配列形式をエクスポート(アンロード)形式として採用してるとき、そのままではインポートできないことになります。ブラケットとカンマをスキップするくらいやればいいのに。

CSV(カンマ区切り)形式もなんだか問題がありそう(現在テスト中)…、データ投入に意外と手間がかかるわ。

[追記]

さらに恐ろしいことが判明。僕が誤解していましたね。インポート可能な形式はJSONじゃないです。独自のインポート形式で、JSON風なだけ

MongoDBのバージョンはwin32-x86_64-2008plus-2.2.3(最新ではない)です。次のデータはインポートできません。

{
  "a": 1
}

$ bin/mongoimport.exe --db test --collection c --type json --file xdata03.json
connected to: 127.0.0.1
Fri Sep 13 10:44:43 Assertion: 10340:Failure parsing JSON string near:
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 kernel32.dll       BaseThreadInitThunk+0xd
Fri Sep 13 10:44:43 exception:BSON representation of supplied JSON is too large:
 Failure parsing JSON string near:
Fri Sep 13 10:44:43
Fri Sep 13 10:44:43 Assertion: 10340:Failure parsing JSON string near: "a": 1
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 kernel32.dll       BaseThreadInitThunk+0xd
Fri Sep 13 10:44:43 exception:BSON representation of supplied JSON is too large:
 Failure parsing JSON string near: "a": 1
Fri Sep 13 10:44:43
Fri Sep 13 10:44:43 Assertion: 10340:Failure parsing JSON string near: }
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 mongoimport.exe    ???
Fri Sep 13 10:44:43 kernel32.dll       BaseThreadInitThunk+0xd
Fri Sep 13 10:44:43 exception:BSON representation of supplied JSON is too large:
 Failure parsing JSON string near: }
Fri Sep 13 10:44:43
Fri Sep 13 10:44:43 imported 0 objects
Fri Sep 13 10:44:43 ERROR: encountered 3 errors

$

どうやら行指向らしくて、テキストの1行に1個のJSONオブジェクトの文字列表現を書かないとダメのようです。ウエー。

[/追記]

kzymtnkzymtn 2017/04/05 06:14 こんにちは。同じことにハマって検索でたどり着きました。
公式ドキュメントを見ると、"--jsonArray"というオプションを付ければ一番はじめの`data.json`がインポートできるようです。
ただし、ファイルサイズの上限が16MBですが。
https://docs.mongodb.com/manual/reference/program/mongoimport/#cmdoption-jsonarray

m-hiyamam-hiyama 2017/04/07 12:34 kzymtnさん、
> "--jsonArray"というオプションを付ければ
そんなオプションがあるのですか、情報ありがとうございます。
1行に1オブジェクトの形がデフォルトなのは、前後を考えずに1行単位で読めばいいから楽ちん、という理由なんでしょう、たぶん。