- ベストアンサー
複雑なcsv
以下のような2つの入力データをデータベースに格納する作業を行っております.2つのデータは,"b"の値によって判別が可能です. 入力データ(スペースをカンマで表現しています): 1 a,b,c - [d,e,[f:g,h:i],[j,[k:m,n:o]]] (p) 2 a,b,c - d:e, f:g この2つのデータをなるべく簡単に処理するにはどのようにすればよろしいでしょうか.私が書いた(ている)コードでは,splitで地道に展開しているのですが,あまりにも要領が悪いかんじです. 簡単なコードを示していただけると嬉しいです.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
私の補足要求の仕方が不適切だった様です。 入力データとカンマで区切る事だけの条件開示だけでは、“b”の違いによる展開処理の違いやDBへの格納内容の違いが理解できないです。 せめて、期待する処理後の結果を開示していただければ、具体的な処理方法の提案ができたかもしれませんが、あきらめて推測だけで回答します。見当違いかもしれませんが御容赦願います。 カンマで区切ったデータを、単純にDBに格納するだけなら LOAD DATA INFILE "./data.csv" INTO TABLE data FIELDS TERMINATED BY ','; 上記SQL文で一気に書込み完了です。bの値による処理の違いはデータ利用時にDB自体の検索機能を利用するのも効率的です。 ただし、bの値によってデータの一部だけを抽出して格納したいのなら、分割の仕方で効率が大きく変わります。 カンマだけの単純な分割ルールで良いのなら以下を行数文だけwhileループを通すのが一般的です。 $a=explode(',',$str); // $strに入力データがあるとする if ($a[1]==<bの条件>) { // 1番の後処理 } else { // 2番の後処理 } 多分、質問者様がやられていることと差異は無いと推測します さらに、格納するデータ抽出(分割)処理を少しでも効率的にしたいのなら、explodeではなく、正規表現で元データを分割処理してからDB格納することになります 例えば、後で各種記号を取り除くなどの処理をする場合は、分割時に一気に不要な文字も除去してアルファベット部だけを抽出すれば後処理が楽になります $a=preg_split('/[, -\[\]\(\)]/',$str,-1,PREG_SPLIT_NO_EMPTY );
その他の回答 (1)
- mpx
- ベストアンサー率71% (149/209)
回答では無く、質問の仕方へのアドバイスです 正規表現を使って分解すれば簡単に出来るかもしれませんが、 そもそも、各項 への分解ルールを明示しないと分け方が分かりません。 カギ括弧[]、カッコ()、ハイフン-、コロン:などを無視してカンマ(,)で区切れば良いのでしょうか? 分解後の期待する結果も明示した方が回答を得やすいですよ
補足
ご回答ありがとうございます. また,言葉足らずな質問で申し訳ございません. > カギ括弧[]、カッコ()、ハイフン-、コロン:などを無視してカンマ(,)で区切れば良いのでしょうか? そうですね.現在のところは,データベースへの格納後に,再度参照することで処理することを考えておりますので,無視して区切っても問題ないと思います. #全然気づきませんでした(^^; 先ほど,少し試してみたのですが,*_replaceを並べて置換するのが良いのでしょうか.他に何か良い方法ありましたら,併せて教えて頂けますと幸いです.
お礼
ご回答ありがとうございます. また,言葉足らずな質問と補足にも関わらず,丁寧に答えていただきまして,ありがとうございました. 現在,実行できる環境にはおりませんが,preg_splitによって単純にクリアできそうです.どちらかというと,PHPというよりは正規表現の知識不足がもんだいだったようです(+日本語と). もう少し勉強して,出直すことにいたします. 本当にありがとうございました.