2012年1月29日日曜日

PHPでCSVファイルを処理する(その1)

という訳で。
ヒトカラから帰ってきました。
受付のすぐそばの部屋に案内されて、ちょっと歌いづらかったです。
それはおいておいて。

このエントリの目的
本エントリでは、PHPでCSVを読み込んで処理するコトを想定しています。
POSTやGETでデータを取得することは想定していません。

このエントリの目次
本エントリではCSVの仕様と、付随する文字コードの問題を調べるまでです。
PHPでの処理までは書けていません(それは次のエントリで書く予定)。

・1.CSVとは
・2.CSVの仕様で個人的に重要と思った箇所
・3.CSVの文字コードはShift-JISが多い
・4.Shift-JISの問題 = 5C問題
・5.長くなったのでここで一旦切ります

1.CSVとは
Comma Separated Valuesの略。
その名の通り、それぞれの値が「,」で区切られたデータのことです。

実は「標準」の規格はなく、RFCで「広報」として仕様をまとめているようです。
RFCの原文は以下。RFC4180です。
Common Format and MIME Type for Comma-Separated Values (CSV) Files

(ちなみに、RFCのドキュメント区分は色々あるようで、rfc-index.txt の見方 | よっち@ほ~むさんにまとまっています。)

2.CSVの仕様で個人的に重要と思った箇所
以下のようなサイトを見てみました。
CSVファイルの一般的書式 (RFC4180 日本語訳) | アルプス登山の玄関口・笠井家
CSVファイルフォーマットの解説 | CodeZine
Comma Separated Values (CSV) Standard File Format | Edoceo, inc

個人的に重要と思った箇所をまとめてみました(誤解や齟齬があるといけないので、自分で調べてみるコトをおすすめします。また、間違った記述がある場合はご指摘頂けると助かります。)。

・改行コードはCRLFとする (← えぇー…って感じ)。
・半角スペースは値の一部として扱われる
・値自体に「"」(ダブルクォーテーション)や「,」(カンマ)や改行(CRLF)を含ませる場合は、値を「"」で囲まなくてはならない。そして値自体に「"」を含ませたい場合は「""」と二つ重ねてエスケープする
・ファイル末尾のレコード終端には、改行があってもなくてもよい。

3.CSVの文字コードはShift-JISが多い
文字コードは全部UTF-8でいいでしょ!と言いたいところですが、CSVはExcelで読み込みや出力できるなど密接な関係があります。
Excelのデフォルトの文字コードはShift-JISです。

で、ExcelでCSVを読み込むとき、文字コードがShift-JIS以外だと日本語が文字化けしてしまうそうです。
つまり、CSVはShift-JISで扱われるコトが多いっぽいです。

4.Shift-JISの問題 = 5C問題
さて、このShift-JISで問題になってくるのが5C問題です(初めて知りましたが…)。

5C問題とは…
Shift_JISでは、「ソ」「噂」など一部の字の2バイト目に、5C16を使用している。
多くのプログラミング環境ではこの5C16エスケープ文字としている
なのでShift-JISを想定していない環境では問題が起こる
とのコトです。
うあああ。

5.長くなったのでここで一旦切ります
次のエントリで、5C問題の解決方法を検証し、本題であるCSVのパースをします。

調べながらエントリを書いてるんですが、こんなに長くなる話題だとは思わなんだ…。
それでは。

2012年1月28日土曜日

Ubuntu 11.10 で PHPからSQLite3を試してみる

最近寒いですね
そんなときはヒトカラしてカラオケルームに引きこもります。
もしくは家に引きこもってコーディングします。
というコトで、PHPからSQLite3 を試してみました。

(SQLiteについてはsqlite3の基本操作まとめ [PCメモ] | てりぶろさんのブログが詳しいです(手抜き))

PHPのバージョンはPHP 5.3.6-13です。

で、インストールにちょっと詰りどころがあったのでメモとして残します。

このエントリの目次
1.パッケージ類のインストール
2.適当なディレクトリにDBを作成してみる
3.適当にコード書いてDBに接続を試みる
4.エラーの解決を試みる(これでいいのかは不明)
5.適当なテーブルを作成しデータ突っ込む
6.PHPからSELECT文を実行してみる
7.最後に

1.パッケージ類のインストール
下記のコマンドで必要なパッケージをインストールします。
sudo apt-get install sqlite3
sudo apt-get install php5-sqlite

2.適当なディレクトリにDBを作成してみる
コマンドラインで下記を入力します。
sqlite3 testdb

すると、「testdb」という名前のDBができ、かつSQLiteとの対話モードに入ります。
.quitと入力してとりあえず脱出。
sqlite> .quit

3.適当にコード書いてDBに接続を試みる
下記のようなPHPを書いてindex.phpという名前で保存します。
<?php
try {
    //下記はPDO('sqlite:<作成したSQLiteのDBのファイルパス>');です
    $db = new PDO('sqlite:testdb');
} catch (Exception $e) {
    error_log(print_r($e, true));
}

コマンドラインから実行してみます。
$ php index.php

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626+lfs/sqlite.so' - /usr/lib/php5/20090626+lfs/sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0

エラー出た!

4.エラーの解決を試みる(これでいいのかは不明)
ヤフったら、Launchpadで同様の問題が書かれているページを発見。
読み進めていると、15番目のコメントに書かれてる手順で解決する様子。

同様の手順を実施してみる。
$ cd /etc/php5/conf.d/
$ sudo mv sqlite.ini sqlite.NOTini

で、もう一度コマンドラインから実行してみると、エラーが出なくなった!
$ php index.php

やったね!

ちなみに、10番目のコメントでは別の解決策が示されています。
ですが、僕が実施した15番目のコメントの方法を示した人が、14番目のコメントにて、
「それはまた別の話だよ (Your workaround is regarding a different issue.)」
と言っているので、この人を信じました(楽な方法だし)。

5.適当なテーブルを作成しデータ突っ込む
という訳で、まずはコマンドラインでテーブルを作成します。
//先ほど作成したtestdbを使う
$ sqlite3 testdb

//対話モードになったので、テーブルを作成する。
sqlite> create table testtable (id integer primary key);
//適当なデータを突っ込む
sqlite> insert into testtable values(1000);
//対話モードから脱出
sqlite> .quit

6.PHPからSELECT文を実行してみる
で、下記のようなPHPコードを書きます。
<?php

try {
    $db = new PDO('sqlite:testdb');
    $sql  = $db->prepare('select * from testtable');
    if (! $sql->execute()) {
        echo 'failed 1';
    }
    echo print_r($sql->fetchALl(), true);
} catch (Exception $e) {
    echo (print_r($e, true));
}

で、実行。
$ php index.php
Array
(
[0] => Array
(
[id] => 1000
[0] => 1000
)

)

問題なく値が取れています!

7.最後に
英語力をもっとつけなければいけないなと思いました。
最初にエラーに遭遇したとき、日本語のブログを見ていました。

が、話題が本件とずれていたり解決していなかったりして、調べる→実行する→違うエラー出る→調べる→実行する→(ryを繰り返し、どんどんおかしな方向に進んでいってました。

ですが、やる気出して英語記事を読んだらすんなり解決しました。
実はLaunchpadを見ると解決するコトが多いのでは?なんて思いました。
(見たのは今回初めてなんですが)

あと、そろそろSyntaxHighlighter入れようかな…。

それでは。

2012年1月9日月曜日

Pythonの公式ドキュメントとコーディング規約

メモメモ
Python 2.7ja1 documentation
Python 2.7.2 のドキュメントの日本語訳です。

Style Guide for Python Code
(Pythonコーディングの慣例の和訳。「規約」ではないのかな)

2012年の目標

プログラミングの色々に触れてみたい
という訳で、一ヶ月毎に違う言語やフレームワークに触れてみたいなと考えています。

1月 Python
2月 Objective-C
3月 C++
4月 C#
5月 Scala
6月 Erlang
7月 Haskell
8月 nginx
9月 CakePHP
10月 Symfony
11月 Django
12月 忙しいかもなので特になし

どの程度できるかどうか分からないし、仕事の勉強をする必要が出ることもあると思うので、あくまでゆるい感じで。

他にもHadoop、Cassandra、UPnPなど 覚えるべき|覚えたい コトがたくさんあります。

頑張るぞー。

Related Posts Plugin for WordPress, Blogger...