【问题标题】:Replace not working更换无效
【发布时间】:2013-12-12 16:04:24
【问题描述】:

我有一个键值对中的数据文本文件,我已设法将其转换为一种格式,其中键值对都由它们之间的下划线分隔,并且键与值由冒号。我认为这种格式对于保持数据中的空间完整无缺很有用。这是一个用数据替换~~~~~~~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:~~~~~~~ ...

我想通过在每个 _TYPE1 之后插入 _TYPE2: 来解决此问题,而不使用 _TYPE2:。由于只有几种不同的可能类型,我设法在每个_TYPE1:~~~~~~ 之后选择_,而后面没有TYPE2:。我使用了以下正则表达式,其中egtype 是可能类型的一个示例:

(?<=_TYPE1:egtype)_(?!TYPE2:)

此时,我所要做的就是将 _ 替换为 _TYPE2:_ 并且每个字段都存在于每一行中,这样可以轻松地将每一行转换为 MySQL 插入语句!不幸的是,当我单击“替换”按钮时,Notepad++ 没有替换它。我不确定为什么。

有谁知道为什么不使用特定的正则表达式将_ 替换为_TYPE2:_?或者是否有人对如何将所有这些数据转换为 MySQL 插入脚本有任何其他建议?

【问题讨论】:

    标签: mysql regex replace notepad++


    【解决方案1】:

    正则表达式

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

    查找:

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

    替换:

    _TYPE2:
    

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


    Python 脚本插件

    作为旁注,我认为使用一个且仅一个正则表达式将您的数据转换为 SQL 插入语句是不可能的,虽然我看到您通过添加假 TYPE2 来尝试做什么,但我不要认为这是你最好的选择。

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

    1. 从插件管理器或official website 安装 Python 脚本插件。
    2. 然后转到插件 > Python 脚本 > 新脚本。为您的新文件选择一个文件名(例如 sql_insert.py)并复制下面的代码。
    3. Run Plugins > Python Script > Scripts > sql_insert.py 和一个新选项卡将显示所需的结果。

    脚本:

    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,我觉得可以用更好的方式编写 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 (~~~,~~~~~,~~~~~~,~~~~~~,~~~~~~~);
    

    【讨论】:

    • 您的正则表达式有效,但 Notepad++ 不允许我替换。也许这是我安装中的错误,或者其他什么。但是,您的 Python 脚本非常棒。我想我将不得不学习 Python。如果我无法弄清楚正则表达式,我会在 PHP 中做类似的事情,但这太棒了!我只需要在数据周围添加',然后使用replace 删除); 之前的换行符,效果很好。谢谢! editor.addText("INSERT INTO table (" + ",".join(columns[line]) + ") values ('" + ",".join(values[line]) +"');\n")
    • 我很高兴脚本有帮助:) 但我不明白为什么你不能替换!是有错误信息还是什么?你有最新的 Notepad++ 版本吗?如果不是,请尝试更新,并确保它至少高于 6.0 版。
    • 其实我再去试一试的时候,发现了一个奇怪的地方。 Replace 按钮一次不能用于一条记录,但Replace All 按钮适用于所有记录。所以我的第一个表达式也很有效,尽管你的更好,因为它可以选择所有的表达式,而不必像我的那样使用每个单独的类型。我的Replace 按钮不起作用仍然很奇怪。
    【解决方案2】:

    尝试搜索(_TYPE1:)(\S\S\S\S\S\S)(_ADDRESS:) 并替换为\1\2_TYPE2:~~~~~~\3 我用你的数据在记事本++中进行了测试,它可以工作
    不要忘记将搜索模式更改为正则表达式。 要将其转换为 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'\);(在记事本++中)

    【讨论】:

    • 我试过你的表达方式,它可以找到但由于某种原因它根本没有替换,可能是一个错误。
    【解决方案3】:

    如果这是一次性问题,那么两步过程将起作用。第一步将在每一行添加一个_TYPE2:SomeDefaultValue。第二步会将其从不需要的行中删除。

    第 1 步:查找内容:$,替换为:_TYPE2:xxx

    第 2 步:查找内容:(_TYPE2:.*)_TYPE2:xxx$,替换为:\1

    在这两个步骤中选择“正则表达式”并取消选择“点匹配换行符”。还将xxx 更改为您的默认值。

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      相关资源
      最近更新 更多