Loading...

ホームページ制作は相模原市にあるオフィス木蓮

  • 042-812-7728
  • 営業時間 9:00~18:00
  • 日曜・祝日はお休み

スタッフブログ

SplFileObject で Shift_JIS の
CSVファイルを読み込む

PHP で CSVファイルといえば、fopen() で指定して fgetcsv() でデータを取得する方法がすぐに頭に浮かび、検索してもその方法が多くヒットされます。で、途中に改行が含まれる CSVファイルを取り扱う場合は・・・。お断りしたいくらいです。

そんな思いに反して「途中に改行が含まれる CSVファイル(Shift_JIS)をPHP(UTF-8)でデータベース(utf8)に保存」というステキなご要望があり、奮闘した記録をここに載せようかと。

SplFileObject

冒頭にも記載した通り、PHP で CSVファイルといえば、fgetcsv() ばかりなのですが、そんな中、見つけたのが「SplFileObject クラス」。そうです。オブジェクト指向です! 5.1 から! 知りませんでした。(^^;
早速、様々なサンプルを拝見し、次のように組んでみました。

$file = new SplFileObject( 'exp.csv' );
$file -> setFlags( SplFileObject::READ_CSV );
$file -> setCsvControl( ',', '"' );
foreach( $file as $key => $line ){
	foreach( $line as $str ){
		$records[$key][] = strlen( $str ) > 0 ? mb_convert_encoding( $str, 'UTF-8', 'Shift_JIS' ) : '';
	}
}
var_dump( $records );

上のスクリプトで、ほとんどは意図した通りに動きました。「ほとんど」・・・です。 希に隣り合う項目が結合されることが見受けられます。 具体的には、「”試験”,”動作”,”042-812-7728″,”神奈川県”」が正しいところ「”試験”,”動作”,042-812-7728″”,”神奈川県”」となり「”動作”,042-812-7728″”」が1つのデータと認識されてしまうことがあります。

原因は、Shift_JIS

ローカルでCSVファイルを UTF-8 で保存し、上のスクリプトで mb_convert_encoding を外して動作チェックを行ったところ、全て意図した通りに動きましたので、原因は文字コードの変換部分。しかも、上記の現象ですから、疑うのは1~2行目の部分。PHP が UTF-8 で CSVファイルが Shift_JIS なのだから、無理があるのは当然かと。

$file = new SplFileObject( 'exp.csv' );
$file -> setFlags( SplFileObject::READ_CSV );

対応策

はじめに一時保存用のファイルを作成し、サーバーにアップ。適切なパーミッションに設定。 csvファイルを file_get_contents で読み込み、文字コードを変換。その後、一時保存用のファイルに保存。 一時保存用のファイルで上のスクリプトを実行させる。 一時保存用のファイルの中身を空にする。

Excel や Access からの CSVファイルは、UTF-8 にして欲しいと思うこの頃です。

ホームページ制作を承ります

相模原市にある会社・店舗・事務所様からのご依頼大歓迎!

【士業】
弁護士(法律事務所),公認会計士,税理士,司法書士,行政書士,社会保険労務士など
【住まい】
不動産,工務店,建設・建築会社,設計事務所,リフォーム会社,建物管理会社,電気工事,水道工事など
【乗り物】
中古車ショップ,バイクショップ,自転車ショップ,自動車整備,運転代行など
【飲食業】
レストラン,カフェ,甘味処,洋菓子店,パン屋など
【医療・福祉】
病院,クリニック,歯科医,整体院,接骨院,介護センターなど
【美容・健康】
トレーニングジム,エステサロン,ネイルサロン,美容院,美容室など
【教育・育児】
専門学校,学習塾,幼稚園,保育園,認定保育園,カルチャースクール,パソコン教室など
【その他】
イベントサイト,産業廃棄事業,リサイクルショップ,雑貨店,ペットショップ,旅館,楽天市場店舗・Yahoo!ストア・MakeShopなど
【外注元】
デザイン事務所、広告代理店、ホームページ制作会社など

上記以外の業種でもホームページ制作・WEBシステム/アプリケーション開発につきましては、神奈川県相模原市中央区にあるオフィス木蓮までお気軽にご連絡・お問い合わせください。スマートフォン・タブレット対応、WordPress によるホームページ制作もお任せ下さい。他社が制作されたホームページでも対応します。また、ウェブアクセシビリティ(Webアクセシビリティ)対応のご相談も承ります。

相模原市にある会社・店舗・事務所のホームページ制作承ります