我有一个键值对数据的文本文件,我已设法将其转换为键值对全部用它们之间的下划线分隔的格式,并且键与值分开结肠。我认为这种格式对于保持数据中的空间完整是有用的。这是一个用~~~~~~~
s代替数据的例子。
_ID:~~~_NAME:~~~~~_DESCRIPTION:~~~~~~~_TYPE1:~~~~~~_TYPE2:~~~~~~ ...etc
我想将其转换为MySQL脚本以将数据插入表中。我的问题是每个记录都没有包含可空字段。例如记录的格式为_TYPE1:
,可能有也可能没有_TYPE2:
... _DESCRIPTION:~~~~~~_TYPE1:~~~~~~_TYPE2:~~~~~~_ADDRESS:~~~~~~~ ...
... _DESCRIPTION:~~~~~~_TYPE1:~~~~~~_ADDRESS:~~~~~~~ ...
... _DESCRIPTION:~~~~~~_TYPE1:~~~~~~_ADDRESS:~~~~~~~ ...
... _DESCRIPTION:~~~~~~_TYPE1:~~~~~~_TYPE2:~~~~~~_ADDRESS:~~~~~~~ ...
... _DESCRIPTION:~~~~~~_TYPE1:~~~~~~_ADDRESS:~~~~~~~ ...
我想通过在没有_TYPE2:
的每_TYPE1
之后插入_TYPE2:
来解决此问题。由于只有几种不同的可能类型,我设法在每个_
之后选择_TYPE1:~~~~~~
,而不是TYPE2:
。我使用了以下正则表达式,其中egtype
是可能类型的一个示例:
(?<=_TYPE1:egtype)_(?!TYPE2:)
此时,我所要做的就是用_
替换_TYPE2:_
并且每一行都存在每个字段,这样可以很容易地将每一行转换为MySQL插入语句!不幸的是,单击“替换”按钮时,Notepad ++没有替换它。我不知道为什么。
有没有人知道为什么它不能用_
替换使用该特定正则表达式的_TYPE2:_
?或者是否有人对如何将所有这些数据转换为MySQL插入脚本有任何其他建议?
答案 0 :(得分:1)
要做你想做的事,试试这个:
查找
_TYPE1:[^_]+\K(?!.*_TYPE2)
替换:
_TYPE2:
您可以使用示例数据对其进行测试,并解释here。
作为旁注,我不认为可以使用一个且只有一个正则表达式将数据转换为SQL插入语句,而当我通过添加假的TYPE2看到你要做的事情时,我不要以为这是你最好的选择。
所以,我的建议是使用Notepad ++的Python Script插件。
columns = [[]]
values = [[]]
current_line = 0
def insert(line, match):
global current_line
if line > current_line:
current_line += 1
columns.append([])
values.append([])
if match:
i = 0
for m in match.groups():
if i % 2 == 0:
columns[line].append(m)
else:
values[line].append(m)
i += 1
editor.pysearch("_([A-Z0-9]+):([^_\n]+)", insert)
notepad.new()
for line in range(len(columns)):
editor.addText("INSERT INTO table (" + ",".join(columns[line]) + ") values (" + ",".join(values[line]) +");\n")
注意:我还在学习Python,我觉得这个可以用更好的方式编写。如果您可以提出改进建议,请随时编辑我的答案或发表评论!
_ID:~~~_NAME:~~~~~_DESCRIPTION:~~~~~~~_TYPE1:~~~~~~_TYPE2:~~~~~~
_ID:~~~_NAME:~~~~~_DESCRIPTION:~~~~~~_TYPE1:~~~~~~_TYPE2:~~~~~~_ADDRESS:~~~~~~~
_ID:~~~_NAME:~~~~~_DESCRIPTION:~~~~~~_TYPE1:~~~~~~_ADDRESS:~~~~~~~
INSERT INTO table (ID,NAME,DESCRIPTION,TYPE1,TYPE2) values (~~~,~~~~~,~~~~~~~,~~~~~~,~~~~~~);
INSERT INTO table (ID,NAME,DESCRIPTION,TYPE1,TYPE2,ADDRESS) values (~~~,~~~~~,~~~~~~,~~~~~~,~~~~~~,~~~~~~~);
INSERT INTO table (ID,NAME,DESCRIPTION,TYPE1,ADDRESS) values (~~~,~~~~~,~~~~~~,~~~~~~,~~~~~~~);
答案 1 :(得分:0)
尝试搜索(_TYPE1:)(\S\S\S\S\S\S)(_ADDRESS:)
并替换为\1\2_TYPE2:~~~~~~\3
我用notepad ++测试了你的数据并且它的工作原理
不要忘记将搜索模式更改为正则表达式。
把它变成一个INSERT脚本只是继续使用像我上面所做的正则表达式,然后用你想要的那个字段括起来然后替换为一个\ number无论哪个字段并移动它们应该是非常简单的手工劳动,玩得开心。
例如,在这里搜索你的整行我只做DESCRIPTION,TYPE1和TYPE2
搜索使用正则表达式
(_DESCRIPTION)(:)(\S\S\S\S\S\S)(_TYPE1)(:)(\S\S\S\S\S\S)(_TYPE2)(:)(\S\S\S\S\S\S)
然后用类似的东西替换
INSERT INTO table1\(desc,type1,type2\)values\('\3','\6','\9'\);
(在记事本++中)
答案 2 :(得分:0)
如果这是一次性问题,那么两步过程就可以了。第一步是为每一行添加_TYPE2:SomeDefaultValue
。第二步将它从不需要它的行中删除。
第1步:查找内容:$
,替换为:_TYPE2:xxx
第2步:查找内容:(_TYPE2:.*)_TYPE2:xxx$
,替换为:\1
在这两个步骤中选择“正则表达式”并取消选择“点匹配换行符”。同时将xxx
更改为默认值。