CSVで3次配列
created: 2003-12-31 22:04 | modified: 2004-01-01 22:08 | reply: 2
[1194] CSVで3次配列
user: 箱 | created: 2003-12-31 22:04
こんにちは。
CSV ←→ 配列に読み出し というような処理において、三次配列を使う必要に迫られました。
もともと一次配列の時はタブ区切りで作業していたんですが、三次にするために新たに2パターン(階層)の区切り方法を考えなければいけない、ということで、新たに区切り文字として「半角カンマ」と「パイプライン(|)」を追加使用しようと思ったんですが、そうすると配列キーや要素の文字列にそれら文字が含まれる場合の対処をしないといけなくなりますよね。
そこで、一般的に入力されない文字(?)として、「エスケープ(\x1b)」と「アラーム(\x07)」を使うことにしました。
それで、一応ちゃんとCSV ←→ 三次配列ってのは実現出来たんですが、そこで気になることが。
●エスケープとかアラームって、キーボードから入力される(あるいはhtmlフォームから送られてくる)ことは心配しなくていいのでしょうか?
●エスケープとかアラームって、phpスクリプトの中で特別な動作をしたりする可能性はあるのでしょうか?(例えば、改行文字はファイルからの読み出しの際に「一行の区切り」としての特別な意味を持ちますよね)
●上に書いた「エスケープとアラームを使う」以外に、もっとスマートな方法ってあるんでしょうか?
何かお気付きの点があればアドバイスいただければ幸いです。
CSV ←→ 配列に読み出し というような処理において、三次配列を使う必要に迫られました。
もともと一次配列の時はタブ区切りで作業していたんですが、三次にするために新たに2パターン(階層)の区切り方法を考えなければいけない、ということで、新たに区切り文字として「半角カンマ」と「パイプライン(|)」を追加使用しようと思ったんですが、そうすると配列キーや要素の文字列にそれら文字が含まれる場合の対処をしないといけなくなりますよね。
そこで、一般的に入力されない文字(?)として、「エスケープ(\x1b)」と「アラーム(\x07)」を使うことにしました。
それで、一応ちゃんとCSV ←→ 三次配列ってのは実現出来たんですが、そこで気になることが。
●エスケープとかアラームって、キーボードから入力される(あるいはhtmlフォームから送られてくる)ことは心配しなくていいのでしょうか?
●エスケープとかアラームって、phpスクリプトの中で特別な動作をしたりする可能性はあるのでしょうか?(例えば、改行文字はファイルからの読み出しの際に「一行の区切り」としての特別な意味を持ちますよね)
●上に書いた「エスケープとアラームを使う」以外に、もっとスマートな方法ってあるんでしょうか?
何かお気付きの点があればアドバイスいただければ幸いです。
[1196] Re.CSVで3次配列
user: ゆうじ | created: 2004-01-01 15:10
> ●エスケープとかアラームって、キーボードから入力される(あるいはhtmlフォームから送られてくる)ことは心配しなくていいのでしょうか?
エスケープとかアラームに限らず、
全てのキャラクタについて、
入力される(送られてくる)可能性はあります。
通常、このような特殊な文字をキーボードから入力できない場合でも、
コピペで入力できたりしますので、
何を区切り文字にするとしても、
ファイル保存前にデコード処理(エスケープ処理)する必要があります。
ファイル入出力の際、
適切なデコードさえしていれば、
区切り文字は何でもいいと思います。
> ●エスケープとかアラームって、phpスクリプトの中で特別な動作をしたりする可能性はあるのでしょうか?(例えば、改行文字はファイルからの読み出しの際に「一行の区切り」としての特別な意味を持ちますよね)
PHPでは、改行コード以外には思い当たりません。
私が知らないだけかも。
> ●上に書いた「エスケープとアラームを使う」以外に、もっとスマートな方法ってあるんでしょうか?
ファイルの形式にこだわらないのでしたら、serialize & unserialize を使って、
多次元配列をまるまるファイルに保存・読み出しという手もあります。
http://jp.php.net/manual/ja/function.serialize.php
エスケープとかアラームに限らず、
全てのキャラクタについて、
入力される(送られてくる)可能性はあります。
通常、このような特殊な文字をキーボードから入力できない場合でも、
コピペで入力できたりしますので、
何を区切り文字にするとしても、
ファイル保存前にデコード処理(エスケープ処理)する必要があります。
ファイル入出力の際、
適切なデコードさえしていれば、
区切り文字は何でもいいと思います。
> ●エスケープとかアラームって、phpスクリプトの中で特別な動作をしたりする可能性はあるのでしょうか?(例えば、改行文字はファイルからの読み出しの際に「一行の区切り」としての特別な意味を持ちますよね)
PHPでは、改行コード以外には思い当たりません。
私が知らないだけかも。
> ●上に書いた「エスケープとアラームを使う」以外に、もっとスマートな方法ってあるんでしょうか?
ファイルの形式にこだわらないのでしたら、serialize & unserialize を使って、
多次元配列をまるまるファイルに保存・読み出しという手もあります。
http://jp.php.net/manual/ja/function.serialize.php
[1201] serialize なるほど!
user: 箱 | created: 2004-01-01 22:08
レス有難うございます。
> 通常、このような特殊な文字をキーボードから入力できない場合でも、
> コピペで入力できたりしますので、
そうですね。試してみたら、確かにコピペで入力出来てしまいますね。
この対策としては、フォームからのデータを成形する、ってので解決しようと思います。
……と思ったら、serializeの件が。
> ファイルの形式にこだわらないのでしたら、serialize & unserialize を使って、
> 多次元配列をまるまるファイルに保存・読み出しという手もあります。
こんな便利な機能があったんですね!
いろいろ自分で調べてはいたんですが、これには全然辿り着けませんでした…。
三次連想配列をテキストにして、それを元に三次配列を生成して…っていうのを
結構苦労して作ったのに??。この機能を使えばイッパツじゃないですか…。
serializeで生成したテキストって良く見ると、サーバに保存される
セッションファイルのテキストに使われている形式なんですね。
セッションファイルのテキストってサーバ側で独自の処理をして変換してる
のかと思ってたんですが、普通にスクリプトで使えるとは。
--------------------
一応自分で出来る範囲のことをやってみてから訊ねるべきだなと思ってたんですが、
この件に関しては先に訊いていれば良かったかもしれないなぁ…。
でもまぁ、苦労した分は勉強になったから良しとしなくては。
ともあれ、訊いてみて良かったです。有り難うございました。
> 通常、このような特殊な文字をキーボードから入力できない場合でも、
> コピペで入力できたりしますので、
そうですね。試してみたら、確かにコピペで入力出来てしまいますね。
この対策としては、フォームからのデータを成形する、ってので解決しようと思います。
……と思ったら、serializeの件が。
> ファイルの形式にこだわらないのでしたら、serialize & unserialize を使って、
> 多次元配列をまるまるファイルに保存・読み出しという手もあります。
こんな便利な機能があったんですね!
いろいろ自分で調べてはいたんですが、これには全然辿り着けませんでした…。
三次連想配列をテキストにして、それを元に三次配列を生成して…っていうのを
結構苦労して作ったのに??。この機能を使えばイッパツじゃないですか…。
serializeで生成したテキストって良く見ると、サーバに保存される
セッションファイルのテキストに使われている形式なんですね。
セッションファイルのテキストってサーバ側で独自の処理をして変換してる
のかと思ってたんですが、普通にスクリプトで使えるとは。
--------------------
一応自分で出来る範囲のことをやってみてから訊ねるべきだなと思ってたんですが、
この件に関しては先に訊いていれば良かったかもしれないなぁ…。
でもまぁ、苦労した分は勉強になったから良しとしなくては。
ともあれ、訊いてみて良かったです。有り難うございました。