从.sql文件中提取值

时间:2012-12-12 17:46:34

标签: php regex

我有一个.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 个答案:

答案 0 :(得分: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更改为您需要的任何内容。

答案 1 :(得分:1)

而不是REGEX,一种简单快捷的方法是将.sql文件导入MySQL,然后将它们导出为CSV格式。

您可以创建临时数据库,以免稀释其他数据库。

如果这是一次性工作,你可以在phpMyAdmin(手动,简单)中完成。

如果这是一个重复的工作,你可以创建一个脚本来自动导入sql并通过命令行导出csv。

答案 2 :(得分: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

答案 3 :(得分:0)

更快的方法是,如果这不是你每天都在做的事情,那就是在编辑器中实际编辑整个文件,让你“搜索/替换”。例如EditPLus。然后,您将替换匹配

的所有内容
`tbl` ( `x`, `y`, `z`) 

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

然后保存,导入已编辑的文件。

我知道这不是解决问题的真正技术方案,但它很容易做到:)