我有一个.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'
并且该文件中可能还有其他一些表,因此仅获取此表非常重要。
我通常不提供问题而不提供我自己的任何代码,但我对正则表达式的东西感到厌烦,这似乎至少对我来说很复杂。
我必须补充一下,有人每隔几天就会上传一次这个文件。我想在将它们插入我的数据库之前为当前值添加一些值,这样我使用正则表达式会更舒服
答案 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;
答案 3 :(得分:0)
更快的方法是,如果这不是你每天都在做的事情,那就是在编辑器中实际编辑整个文件,让你“搜索/替换”。例如EditPLus。然后,您将替换匹配
的所有内容`tbl` ( `x`, `y`, `z`)
到
`your_tbl` ( `your_x`, `your_y`, `your_z`)
然后保存,导入已编辑的文件。
我知道这不是解决问题的真正技术方案,但它很容易做到:)