« TracLightning用multireposパッチ | トップページ | SearchHyperEstraierに機能追加してみました。 »

2009年2月19日 (木)

SQLite DBの変更作業をしてみました

大して何も考えずに作ったpatch(マルチリポジトリの件)のわりに
普通に動いてる(と思う)ので本格的に移行。

1.trac.iniの修正
2.dbの修正

のような感じでできるかなと思いましたが、
dbの修正を行うのにSQLite Database browserだけで作業すると
ちょっと大変なので、
テーブルをexport、テキストエディタで置換作業、
テーブルにimportのような作業にならないか
試行錯誤。

guiでSQLiteのdbを操作できるものの中で
export/importで文字コードの指定ができ、操作性もよいもの
ということでtksqliteを探し出す。
http://reddog.s35.xrea.com/wiki/TkSQLite.html#download
ちゃんと日本語のguiです。

これで、tksqliteで編集したいテーブルを「列名を出力」にして
text(csv)に出力(UTF-8))し、編集、
tksqliteで「1行目を列として扱う」にしてtext(csv)(UTF-8))でとりこみ。
(DBは必ずバックアップを取ってから編集。)

取り込みの際は、
編集したいテーブルを表示、全て選んで削除にし、
そこに読み込む。
(スキームの定義などやるのは大変だからこれが一番楽。
これが簡単にやれるのはtksqliteくらいじゃないかと。)

あとはtext化したものをUTF-8でどう編集するか。
私の場合、作業のひとつに

//trac/aaa/changeset/xxx
    ↓
changeset:xxx/aaa

のような置換(xxxは数字の文字列)が100個以上必要でした。

テキストエディタや他のテキスト変換フリーウェアを探し、
もともとそういう操作ができないか
試すと結果に誤りが出ることがあるなどでどれも使えず。

結局pythonでやってみることに。

# -*- coding: utf-8 -*-

import sys, string
import re

argvs = sys.argv  #コマンドライン引数リスト
argc = len(argvs) #引数の個数

if (argc != 3):   #3でなければ出る
    quit()
fin = open(argvs[1], "r")
fout = open(argvs[2], "w")

s="//trac/aaa/changeset/"
s0="changeset:"
s1="/aaa"
for x in fin.readlines():
    n=x.find(s) #-1ならなし
    if n!=-1:
        #sがあれば次は必ず数字が来ると想定
        #数字がどこまであるか検索する
        start = (n+len(s))
        for m in range(1,len(x)-len(s)):
            if not x[start:(start+m)].isdigit():
                break
        s2 = x[start:(start+m-1)] #s2は数字の文字列
        x = re.sub(s+s2,s0+s2+s1 , x) #置換
    fout.write(x)
fin.close()
fout.close()

これをrepl.pyという名前とすると、

python repl.py wiki.csv wiki_out.csv

でとりあえずできました。

残りの編集はテキストエディタで行い、tksqliteを使ってimport。
やっと文字化けなしで変更作業を終えました。

|

« TracLightning用multireposパッチ | トップページ | SearchHyperEstraierに機能追加してみました。 »

trac」カテゴリの記事

TracLightning」カテゴリの記事

python」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: SQLite DBの変更作業をしてみました:

« TracLightning用multireposパッチ | トップページ | SearchHyperEstraierに機能追加してみました。 »