替换不工作

时间:2013-11-27 06:18:17

标签: mysql regex replace notepad++

我有一个键值对数据的文本文件,我已设法将其转换为键值对全部用它们之间的下划线分隔的格式,并且键与值分开结肠。我认为这种格式对于保持数据中的空间完整是有用的。这是一个用~~~~~~~ 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插入脚本有任何其他建议?

3 个答案:

答案 0 :(得分:1)

正则表达式

要做你想做的事,试试这个:

查找

_TYPE1:[^_]+\K(?!.*_TYPE2)

替换:

_TYPE2:

您可以使用示例数据对其进行测试,并解释here


Python脚本插件

作为旁注,我不认为可以使用一个且只有一个正则表达式将数据转换为SQL插入语句,而当我通过添加假的TYPE2看到你要做的事情时,我不要以为这是你最好的选择。

所以,我的建议是使用Notepad ++的Python Script插件。

  1. 从插件管理器或official website安装Python脚本插件。
  2. 然后转到插件&gt; Python脚本&gt;新脚本。选择新文件的文件名(例如sql_insert.py)并复制后面的代码。
  3. 运行插件&gt; Python脚本&gt;脚本&gt; sql_insert.py和一个新选项卡将显示所需的结果。
  4. 脚本:

    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更改为默认值。