Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否使用python脚本从source.sql读取并写入destinion.sql?_Python - Fatal编程技术网

是否使用python脚本从source.sql读取并写入destinion.sql?

是否使用python脚本从source.sql读取并写入destinion.sql?,python,Python,我有一个文件source.sql INSERT INTO `Tbl_ABC` VALUES (1, 0, 'MMB', '2 MB INTERNATIONAL', NULL, NULL, 0) INSERT INTO `Tbl_ABC` VALUES (2, 12, '3D STRUCTURES', '3D STRUCTURES', NULL, NULL, 0) INSERT INTO `Tbl_ABC` VALUES (2, 0, '2 STRUCTURES', '2D STRUCTURES'

我有一个文件source.sql

INSERT INTO `Tbl_ABC` VALUES (1, 0, 'MMB', '2 MB INTERNATIONAL', NULL, NULL, 0)
INSERT INTO `Tbl_ABC` VALUES (2, 12, '3D STRUCTURES', '3D STRUCTURES', NULL, NULL, 0)
INSERT INTO `Tbl_ABC` VALUES (2, 0, '2 STRUCTURES', '2D STRUCTURES', NULL, NULL, 0)
INSERT INTO `Tbl_ABC` VALUES (2, 111, '2D STRUCTURES', '3D STRUCTURES', NULL, NULL, 1)
我将编写一个名为destination.sql的新文件。它将包含: 新文件将被忽略

`INSERT INTO `Tbl_ABC` VALUES (1, dont wirte if !=0, 'MMB', '2 MB INTERNATIONAL', NULL, NULL, don't write if !=0)
我的sql可能比这个记录的更详细,但位置一般是保持不变的。 在这种情况下,位置[1]处的第一个数字0 第二个0位于位置[6](从0开始计数)

结果应该是这样

INSERT INTO `Tbl_ABC` VALUES (1, 0, 'MMB', '2 MB INTERNATIONAL', NULL, NULL, 0)
INSERT INTO `Tbl_ABC` VALUES (2, 0, '2 STRUCTURES', '2D STRUCTURES', NULL, NULL, 0)
这里的任何人都可以帮助我找到格式化source.sql文件并编写新文件的方法。 destination.sql


谢谢。

您可以逐行阅读,检查是否以0结尾),并与另一行的正则表达式匹配

import re
dest=open("destination.sql","w+")
for line in open("source.sql","r"):
    if line.strip().endswith("0)") and re.search("\(\d+, 0,",line):
        dest.write(line)
大概是这样的:

import re

RX = re.compile(r'^.*?\(\d+,\s0,.*\s0\)\s*$')

outfile = open('destination.sql', 'w')
for ln in open('source.sql', 'r').xreadlines():
    if RX.match(ln):
        outfile.write(ln)
我的sql可能比这个记录的更详细,但位置一般是保持不变的。在这种情况下,第一个数字0位于位置[1],第二个数字0位于位置[6](从0开始计数)

致S.Mark,fviktor 我试过这样做

进口稀土

RX = re.compile(r'^.*?\(\d+,\s0,.*\s0\)\s*$')

outfile = open('destination.sql', 'w')
for ln in open('source.sql', 'r').xreadlines():
    replace1 = ln.replace("INSERT INTO `Tbl_ABC` VALUES (", "")
    replace2 = replace1.replace(")", "")
    list_replace = replace2.split(',')
    #print list_replace
    #print '%s ,%s' % (list_replace[1], list_replace[6])
    if list_replace[6]==0 and list_replace[1] == 0:
        #start write line to destination.sql!!!!!!!! NEED HELP
        #if RX.match(ln):
        outfile.write(ln)

(2,x1,'2D STRUCTURES','2D STRUCTURES',NULL,NULL,x6,15,2',NULL,NULL,NULL,'2D STRUCTURES',MAILLOT 12/08/05',-1,'tata 20/05/02',0,NULL,0,NULL,NULL)


当然,如果位置[1]!=0和位置[6]!=在这种情况下,0是x1和x6。谢谢你的

事实0它永远是线的尽头。在将出现问题的值(1,0,'MMB',2MB INTERNATIONAL',NULL,NULL,0,0)中插入
Tbl_ABC
。我更喜欢这个职位。在本例中,0位于[1](从0开始计数)第二个o位于[6]位置,事实上,我有比这更多的线索。但是这个例子是第一个0行的位置这个例子在位置[1](从0开始计数)第二个0在位置[6]对不起我不确定的问题。例如:插入到
Tbl\u ABC
值中(2,0,'2D STRUCTURES','2D STRUCTURES',NULL,NULL,0,15,2',NULL,NULL,NULL,2D STRUCTURES',MAILLOT 12/08/05',-1',tata 20/05/02',0,NULL,0,NULL,0,NULL,NULL),这正是我所需要的。如果脚本源代码是这样的,我会考虑我的情况:例如:插入Tbl_ABC值(2,0,'2D STRUCTURES','2D STRUCTURES','NULL,NULL,0,15,2','NULL,NULL,NULL,NULL,'2D STRUCTURES','MAILLOT 12/08/05',-1,'tata 20/05/02',0,NULL,0,NULL,NULL,NULL,NULL,NULL,'2dstructures','2D STRUCTURES','2D STRUCTURES','1,'tata 20/05/02',0,NULL,0,NULL,NULL,NULL,NULL,'NULL);我是如何将其修改为mach?RX=re.compile(r'^...**(\d+,(\d+从Python 2.3开始就不需要了。它的作用与简单地在文件上迭代相同。我似乎是一个老Python开发人员;-(2,x1,'2D STRUCTURES',2D STRUCTURES',NULL,NULL,NULL,x6,15,2',NULL,NULL,NULL,NULL,NULL,'2D STRUCTURES',MAILLOT 12/08/05',1,'tata 20/05/02',0,NULL,NULL,NULL)当然,如果位置[1]!=0和位置[6],我不需要写入destination.sql!=0在本例中为x1和x6。感谢您的帮助。除了完全解析SQL语句外,没有可靠的方法使用正则表达式或任何文本解析对这些字段进行筛选。我可以为您提供一个regexp,但这可能不可靠。更好的解决方案是将数据加载到MySQL(我想您会使用它)通过在具有这些字段的空SQL表上执行这些INSERT语句,然后删除输出中不需要的记录,然后转储该表,以文本形式获取INSERT语句。这将是一种比尝试筛选文本转储更可靠、更通用的解决方案。但如果您没有选择,必须筛选文本转储无论如何,这里是一个(不可靠)的regexp,然后这里是一个(不可靠)的regexp,下面是一个(不可靠)的regexp,下面是一个(不可靠)的regexp,下面是一个(不可靠)的regexp,上面是:以下是:以下是:以下是:以下是以下是一个(不可靠)的以下是:以下是:下面是:下面是:下面是一以下是:以下是一个(不(不可靠)的(不可靠)的)这里是以下是这里是以下是以下是一个(不(不可靠)的)的以下是这里是这里是这里是一个(不可靠)的是一个(不可靠)的regexp的以下是一个(不可靠)的以下是以下是以下是以下是以下是:以下是一个:以下是以下是一个(以下是以下是一个(不可靠)的)的)的以下是:以下是以下是以下是以下的)的以下是:以下是一个(\s*$此regexp将匹配此类INSERT语句,并将前七个值提取为匹配组。请注意,第七个值之前的异常值(不是字符串或包含转义撇号的字符串,也接受NULL)可能会导致问题。警告您!