プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。

国が購入するマシンは… 国が購入するマシンは… (その6) なんでCHDIRしてるの? (その6) なんでCHDIRしてるの?

2005/07/27

【若いモンの発想はわからん】(その5) 「エスケープする」の意味がわからない?

今日も、こんな事があった。

PostgreSQL 7.2.3 の pg_dump で出力したデータを、PostgreSQL 7.4.3 に読み込ませるためのコンバータを書かせた。
コンバータといっても、たいしたことはない。
CR と LF を、適切に変換するだけである。

具体的には、こうだ。
以下のデータを、7.4.3で読み込めるようにコンバートしたい(カッコ内は、生コード)。

----- 7.2.3 データ -----
COPY "table_hoge" FROM stdin;
AA
BB(CR)\
CC
\.
-----

このデータは、2レコードを投入する。
1レコード目は、「AA」
2レコード目は、「BB(改行)CC」

これを、7.4.3 で読めるようにするには、以下の様に変換すればよい。

----- 7.4.3 データ -----
COPY "table_hoge" FROM stdin;
AA
BB\r\nCC
\.
-----

この程度のフィルタ・プログラム、30秒で書ける。
ところが、社員は、3時間かけてこんなプログラムを書いた。

-----
#!/usr/bin/perl
foreach (<STDIN>)
{
  s/\r//g;
  s/\\//g;
  s/\n/\\n/g;
  print;
}
-----

ぜんぜんダメである。

(1).s/\r//g;
 勝手にデータを削除するなよ。

(2).s/\\//g;
 なんでデータから、すべての「\」を削除してしまうんだよ。

(3).s/\n/\\n/g;
 こんな事をしたら、全部の行がくっついてしまうではないか。

要するに、社員は、以下の事が理解できていないのである。

 ・2レコード目のデータ中に含まれている改行は、「\」でエスケープされている。

こんな程度の事、プログラムを作成するときに、説明など必要なのだろうか?
あまりにも基本的な知識が無さすぎる。



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/07/27 23:30:30


コメント

 このシリーズ、いつも楽しみにしています。


 これって、ダンプしたデータがすでにあって、それが COPY 形式で、バージョン間で仕様が変わったからこういう変換が必要、ということですよね?

 こちらでは、PostgreSQL の DB のダンプは SQL 形式でしかとったことがないので・・・・。(時間はかかりますが)


 なので、バージョン間でこのような違いがあることは知りませんでした・・・・。

投稿者 GOTTi : 2005/07/28 01:43:10

> バージョン間で仕様が変わったからこういう変換が必要
そうです。

> DB のダンプは SQL 形式でしかとったことがないので・・・・。
普通は、それで何ら問題ないと思いますが、なにぶん、うちの会社で扱っているデータは、最大で3億レコードあったりしますので、INSERT INTO で投入したら、いつまでも処理が終わりません。(^^;

> バージョン間でこのような違いがあることは知りませんでした・・・・。
こちゃこちゃと、バージョン毎に細かい違いがあります。
PostgreSQLは、まだまだ進化しきってないって事ですね。

投稿者 ずんべ : 2005/07/28 02:27:35

3億レコードはきついですね・・・。
Potgreも、よく動いている、といった感じでしょうか?
(ウチの場合は、多くて100万程度です。ほとんどはもっと少ない)

ダンプとリストアは、他のDB製品でも結構ネックになりますよね・・・。

時間が許せば、SQL形式ダンプが一番安心ですね。

投稿者 GOTTi : 2005/07/28 05:18:10


コメントしてください






保存しますか?


スパム対策:
この入力フィールドに「22」と入力してください。


プログラマ ずんべ の日記:ずばヒット アマゾン