-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

这个问题可以通过将表以临时名称导入数据库,然后通过查询获取数据并删除表来解决。

# 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 回答
1

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

您可以创建一个临时数据库以不稀释其他数据库。

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

如果这是一项重复性工作,您可以编写一个脚本来通过命令行自动导入 sql 和导出 csv。

于 2012-12-12T17:53:15.687 回答
0

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

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

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

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

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

于 2012-12-12T17:58:42.140 回答