-1

いくつかのデータベースからエクスポートされたコードを含む.sqlファイルがあります

   # Dump File
    # Database is ported from MS Access
    CREATE DATABASE IF NOT EXISTS `movedb`;
    # Table structure for table 'test_prefixSwitchboard Items'
    DROP TABLE IF EXISTS `test_prefixSwitchboard Items`;
    CREATE TABLE `tbl` (
      `x` INTEGER NOT NULL, 
      `y` INTEGER NOT NULL DEFAULT 0, 
      `z` VARCHAR(255)
    ) ENGINE=innodb DEFAULT CHARSET=utf8;
    SET autocommit=1;
    #
    # Dumping data for table 'Switchboard Items'
    #
    INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '111' , '111' ,'111');
    INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '222' , '2222' ,'222');
    INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '333' , '333' ,'333');

その値をデータベースに入れたいのですが、列名は.sqlファイルの列名とは異なるため、値を抽出するだけで済みます。

'111' , '111' ,'111'
'222' , '2222' ,'222'
'333' , '333' ,'333'

そのファイルには他のテーブルが含まれている可能性があるため、このテーブルのみを取得することが重要です。

私は通常、自分のコードを提供せずに質問することはありませんが、正規表現を嫌うので、少なくとも私にとっては非常に複雑なようです。

追加する必要があります。誰かがこのファイルを数日おきにアップロードします。データベースに挿入する前に現在の値にいくつかの値を追加したいので、正規表現をより快適に使用できます

4

4 に答える 4

1

次のように、部分を一致させてから、文字列の最後にVALUES (到達するまでテキストをキャプチャできます。);

preg_match_all( '/VALUES\s+\(\s+(.*?)(?=\);\s*$)/', $file, $matches);

foreach( $matches[1] as $match) {
    echo $match;
}

これは印刷されます:

'111' , '111' ,'111' 
'222' , '2222' ,'222' 
'333' , '333' ,'333'

編集:テーブル名の場合、テーブル名を正規表現に追加してから、次のように列名をキャプチャする必要がないため、列名を確認します。

preg_match_all( '/`tbl`.*?VALUES\s+\(\s+(.*?)(?=\);\s*$)/m', $file, $matches);

tbl必要なものに変更できる場所。

于 2012-12-12T17:51:03.680 に答える
1

REGEXの代わりに、簡単で迅速な方法は、.sqlファイルをMySQLにインポートしてから、CSVとしてエクスポートすることです。

他のデータベースを希釈しないための一時データベースを作成できます。

これが1回限りの作業である場合は、phpMyAdmin(手動で簡単)で行います。

それが繰り返しの作業である場合は、コマンドラインからSQLを自動インポートしてcsvをエクスポートするスクリプトを作成できます。

于 2012-12-12T17:53:15.687 に答える
1

この問題は、テーブルを一時的な名前でデータベースにインポートし、クエリを介してデータを取得してテーブルを削除するだけで解決できます。

# Dump File
# Database is ported from MS Access
CREATE DATABASE IF NOT EXISTS `movedb`;
# Table structure for table 'test_prefixSwitchboard Items'
DROP TABLE IF EXISTS `test_prefixSwitchboard Items`;
CREATE TABLE `tbl` (
  `x` INTEGER NOT NULL, 
  `y` INTEGER NOT NULL DEFAULT 0, 
  `z` VARCHAR(255)
) ENGINE=innodb DEFAULT CHARSET=utf8;
SET autocommit=1;
#
# Dumping data for table 'Switchboard Items'
#
INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '111' , '111' ,'111');
INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '222' , '2222' ,'222');
INSERT INTO `tbl` ( `x`, `y`, `z`) VALUES ( '333' , '333' ,'333');

CREATE TABLE `tb2` (
  `x2` INTEGER NOT NULL, 
  `y2` INTEGER NOT NULL DEFAULT 0, 
  `z2` VARCHAR(255)
) ENGINE=innodb DEFAULT CHARSET=utf8;
SET autocommit=1;

insert into tb2 (x2,y2,z2) select x, y, z from tbl;
drop table tbl;

SQLフィドル:http ://sqlfiddle.com/#!2/b97ce/1/0

于 2012-12-12T18:02:47.043 に答える
0

これが日常的に行っていることではない場合、さらに迅速な方法は、「検索/置換」を可能にするエディターでファイル全体を実際に編集することです。たとえば、EditPLusです。次に、一致するすべてのものを置き換えます

`tbl` ( `x`, `y`, `z`) 

`your_tbl` ( `your_x`, `your_y`, `your_z`)

次に、編集したファイルを保存してインポートします。

私はそれが問題の本当に技術的な解決策ではないことを知っていますが、それは非常に簡単です:)

于 2012-12-12T17:58:42.140 に答える