【问题标题】:Regular expression to replace only the first semi colon with a double quote正则表达式仅用双引号替换第一个分号
【发布时间】:2021-05-23 06:58:44
【问题描述】:

有一个分号分隔的数据转储。

如何将该数据加载到 Postgres SQL 数据库?

City;Latitude;Longitude
London;51.50;0.12
Paris;48.85;2.35

我想使用 Atom 文本编辑器从这些数据中准备一个插入语句。 但是还有另一个挑战,第一个分号需要用单引号和逗号替换才能生成有效的插入语句。

表的 DDL:

create table cities (
    name varchar(100),
    Latitude float,
    Longitude float
);

插入语句应如下所示:

insert into cities values('London',51.50,0.12);
insert into cities values('Paris',48.85,2.35);

但我只能使用 atom 文本编辑器生成这个:

insert into cities values('London,51.50,0.12);
insert into cities values('Paris,48.85,2.35);

以上是通过用逗号替换分号来实现的。使用^在开头添加insert into cities values('$在添加中添加);

那么问题来了,atom 文本编辑器要使用什么正则表达式来替换第一次出现的分号?

【问题讨论】:

    标签: sql postgresql atom-editor


    【解决方案1】:

    您不需要预先编辑您的输入字符串,也不需要将每个条目单独插入;它可以在一个插入语句中完成。您有一个具有已知数量的组件和分隔符的字符串,因此请使用函数 regexp_split_to_array 以分号 (;) 分割。然后直接插入到引用元素的表中并根据需要进行转换。见Demo

    with loc( loc_str) as ( values('London;51.50;0.12'), ('Paris;48.85;2.35')) 
    insert into cities(name, latitude, longitude) 
         select loc_part[1], loc_part[2]::float,loc_part[3]::float
           from ( select regexp_split_to_array(loc_str,';') loc_part from loc) l;
    

    您还可以使用 COPY 从源文件加载临时表,然后使用与上述基本相同的方法从中填充您的表。 (也在演示中)

    【讨论】:

      【解决方案2】:

      这应该可行:

      找到:^(.+);(.+);(.+) 替换:insert into cities values('$1',$2,$3);

      (我推荐这个免费资源作为试验正则表达式的好方法:https://regex101.com/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2018-05-18
        • 1970-01-01
        • 2010-12-09
        相关资源
        最近更新 更多