phpでカンマ区切りのtxtファイルを読み込んで、ポスグレSQLのインサート文を作り出すプログラムについて

このQ&Aのポイント
  • phpを使用して、カンマ区切りのtxtファイルを読み込み、ポスグレSQLのインサート文を生成するプログラムを作成しています。
  • 特定の列を飛ばしてデータを登録するための方法についてご教示ください。
  • ファイルのデータにはABC列から始まるデータがありますが、C、D、Gの列は登録しないようにしたいです。
回答を見る
  • ベストアンサー

phpでsql文を生成するプログラム

phpでカンマ区切りのtxtファイルを読み込んで、ポスグレSQLのインサート文を作り出すプログラムを作っています。 $file = 'ファイル名'; $filedata = file($file); for($j=1 ; $j < count($filedata);$j++){ こんな感じで展開して、implode とかを使って  $sql_valueを生成して print $sql[]='INSERT INTO ' . shop .'(' . カラム名 .') VALUES(' . $sql_value .')'.";\n"; } というsql文を作りたいのですが、ファイルのデータの中の特定の列だけ飛ばして登録したいと思っています。 たとえば、 ABCDEFG 1111111 1111111 の様なデータの場合、C、D、Gの列は$sql_valueに入れないようにしたいのです。 何かいい方法はありませんでしょうか?

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

file名が'data.txt'でしたら、 $a = array_map(create_function('$l', 'return preg_replace(\'/((?:[^,]*,){2})((?:[^,]*,){2})([^,]*,[^,]*),[^,]*/\', \'$1$3\', $l);'), file('data.txt')); こんなんでどうでしょう? $aに変換結果が入ります。

pop4532
質問者

お礼

ありがとうございました。 助かりました。

その他の回答 (1)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

質問の意味がちょっとわかりにくいのですが、 A,B,C,D,E,F,G 1,2,3,4,5,6,7 という文字列を 1,2,5,6 に変換したいということでしょうか? そうだとしたらこんな手があります。 1つは、正規表現を使う手です。 $sql_value = preg_replace('/((?:[^,]*,){2})((?:[^,]*,){2})([^,]*,[^,]*),[^,]*/', '$1$3', $sql_value); さもなければ、すなおにimplode、explodeを使うんでしょうね。 list($a, $b, $c, $d, $e, $f,$g) = explode(',', $sql_value); $sql_value = implode(',', array($a, $b, $e, $f)); とか

pop4532
質問者

補足

わかりにくくてすみませんでした。 そうですね。ファイルのカラム数とデータベースのカラム数が違うので、不要なカラムの値をsql文に入れないようにしたいのです。 具体的にはやはり、ファイルを展開し二次元配列にした後に、 回答していただいたような処理を行うのがベストでしょうか?

関連するQ&A

  • SQLのINSERT文について

    SQLのINSERT文について Accessを使用していて1列目が管理Noとなっています。 その時のレコード数を管理Noに指定したいのですがうまく行きません。 Insert Into TableA Values((Select Count(*) From TableA),'データ') 原因もしくは他の方法があればご教授お願いします。

  • PHPによるSQL文の中にPHP処理を記述するには

    PHP内のSQL発行部分の $QUERY="     INSERT     INTO         TABLE     (         `FIELD_A`,         `FIELD_B`,         `FIELD_C`     ) values (         `{$DATA[1]}`,         `{$DATA[2]}`,         `{$DATA[3]}`     ) "; このようなクエリを $QUERY="     INSERT     INTO         TABLE     (         `FIELD_A`,         `FIELD_B`,         `FIELD_C`     ) values (         `{$DATA[($i++)]}`,         `{$DATA[($i++)]}`,         `{$DATA[($i++)]}`     ) "; のような感じにしたいのですが うまくいきません。 どうすれば、クエリー文の中で$i++等の処理を 含まさせることができるでしょうか?

    • ベストアンサー
    • PHP
  • エクセルVBAで、INSERT文を生成

    エクセルのデータよりDBにINSERTするためのINSERT文を生成するマクロを作っています。 INSERT文生成のVBAはできたのですが、少し仕様がいつもと違い困っております。皆様のお知恵を拝借できればと思っております。 【仕様】 1.1行ずつセルに文字列があるかどうかチェックする 2.セルに文字列が入ってる場合、例えば"z_1"が入ってる場合、一番左端のセル(A列)に記載されているID、例えば"001"、とともにinsert文を生成。 → INSERT INTO TBL名 id,code VALUES ('001','z_1') 3.1行には複数文字列が入っている場合があるので、文字列がある限りinsert文を生成。 4.文字列がないと判明した場合、次の行へ移動。 【具体例】 A1のセルにID:001 1行目の行、C1のセルに"z_1"、F1のセルに"j_5"、M1のセルに"c_3"などといった文字列があります。 この行のセルを一個ずつチェックして文字列があると、A1のIDを参照して、 INSERT INTO TBL名 id,code VALUES ('001','z_1') などといったインサート文を生成。 文字列がある限りINSERT文を生成します。 お知恵を拝借できれば幸いです。

  • エクセルでSQL文を自動で出力させたい

    INSERT INTO `TableInfo` ( `author_id` , `name` , `no` , `addr` ) VALUES ('其一', '其二', '其三', '其四'); 上記のようなテーブルがありINSERTでデータを登録させていきたいと思っています。 そこで、エクセルに打ち込んだデータを、 '其一' '其二' '其三' '其四' に置き換えてSQL文としてテキストファイル等に出力させたいと思います。 エクセルはあまり得意ではなくどうやれば良いか判りません。 どなたか御教授お願い致します。

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • phpでのSQLでのデータの追加方法

    phpでのSQL実行に関して、下記のデータを追加するコードがあります。 mysql_query('INSERT INTO my_items SET maker_id=1, item_name="もも", price=210, keyword="缶詰,ピンク,甘い", sales=0, created="2010-08-01", modified="2010-08-01"') or die(mysql_error()); echo 'データを挿入しました'; 私は。それを INSERT INTO (フィールド名) VALUES(値) のSQL文で実行したいのですが、その方法が分かりません。 よろしければ、それを実行するコードを教えてください。お願いします。

    • ベストアンサー
    • PHP
  • SQLでできますか?

    SQLでできますか? INSERT INTO test (A) VALUES (B)というSQLを発行したいのですが、このSQLのVALUESのBにあたる部分を正規表現的に指定して、一度のクエリで以下のような結果を得たいのです。 1.テーブルhogeのpiyoカラムの値の先頭がappleになっている行を探す。 2.(1.)で抽出した行のidの値をBとする。 例えば、以下のようにです。 ■皆様が回答してくださるSQL文(1クエリで行いたい) ???????????? ■皆様が回答してくださるSQL文と同等の意味を持つSQL群 INSERT INTO test (A) VALUES (100) INSERT INTO test (A) VALUES (101) INSERT INTO test (A) VALUES (102) ■テーブルhoge _____id_____piyo__________created 1. 100 applebanana 2009/01/02 2. 101 apple_12345 2009/01/03 3. 102 appleXXXXXX 2009/01/04 4. 103 bananananan 2009/01/05 5. 104 ringogogogo 2009/01/06 分かりにくい説明ですが、お詳しい方、どうかご回答の程を宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • 一括でINSERTする方法(PL/SQL)

    PL/SQLを利用して、下記3つのSQLを一括でinsertしたいと思います。 (値は、任意でありません。) PL/SQLに関して、初心者なので、どのように記述してよいか 分かりません。 サンプル的なソースを用いて解説して頂けるとありがたいです。 (1)INSERT INTO tb1(列1, 列2) VALUES('値1','値2') (2)INSERT INTO tb1(列1, 列2) VALUES('値3','値4') (3)INSERT INTO tb1(列1, 列2) VALUES('値5','値6')

  • SQLへファイルを格納

    PHP+MySQL(接続にはDB.phpを利用)を利用してフォームからファイルを アップしてそれをDBに格納するプログラムを組んでいるのですが データベースの構造は CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `filedata` longblob, `kaku` text collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ; 下記がそのプログラムの処理部分です。 $data = file_get_contents($_FILES['upfile']['tmp_name']); $sql ="INSERT INTO test(filedata,kaku) VALUES('$data','$kaku')"; $DbObj->DBSQL($sql); ・$DbObj DB.phpを利用してのデータベース接続オブジェクト(クラス)で クラスの中身は商用のWebアプリの開発用のため掲示できませんが この処理以外は正常に動いています。 $sql ="INSERT INTO test(filedata,kaku) VALUES('11','$kaku')"; では正常動作確認しています。 ・$kaku ファイルの拡張子を格納している(拡張子はファイルを取りだ時に利用) 主キーはauto_incrementを利用しているのでINSERT文で設定の必要なし。 って状況で実行をすると DB Error: syntax error とエラーをはき処理できません。 どのようにしたらデータベースに格納できのでしょうか?

    • ベストアンサー
    • PHP
  • SQL文の内容に関わらず、使うメソッドを固定したい

    C# 2010 version 4.0を使用しています。 System.Data.SQLiteにおいて、SQL文を実行するときに 例えば insert文なら command.CommandText = "INSERT INTO tbl1 (title) VALUES ('title1)"; command.ExecuteNonQuery(); select文なら command.CommandText = "SELECT * FROM tbl1"; using (SQLiteDataReader reader = command.ExecuteReader()){ } とSQL文の内容によってそれぞれ別のメソッドを使うと思うのですが、 内容を気にせずとりあえずSQLを発行する処理だけは同じメソッドで 記述することはできないのでしょうか?またはそのようなメソッドなどは用意されてはいないのでしょうか?

専門家に質問してみよう