csv 按记录中包含的分隔符拆分

rryofs0p  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(145)

我有一个专栏,我在雪花分裂。
格式如下:

我在查询中使用了split_to_table(A, ','),但您可能会发现,这也不正确地拆分了Scooter > Sprinting, Jogging and Walking记录。
也许有定界符只工作,如果没有空格的任何一边?因为我看不出一个不同的条件,可以工作。
我一直在网上搜索,但还没有找到合适的工作,有没有人遇到过类似的问题在过去?
谢谢

2wnc66cl

2wnc66cl1#

这是分割目的数据表的自订规则,因此我们可以使用UUTF来套用自订规则:

create or replace function split_to_table2(STR string, DELIM string, ROW_MUST_CONTAIN string)
returns table (VALUE string)
language javascript
strict immutable
as
$$
{
    initialize: function (argumentInfo, context) {
    },
    processRow: function (row, rowWriter, context) {
        var buffer = "";
        var i;
        const s = row.STR.split(row.DELIM);
        for(i=0; i<s.length-1; i++) {
            buffer += s[i];
            if(s[i+1].includes(row.ROW_MUST_CONTAIN)) {
                rowWriter.writeRow({VALUE: buffer});
                buffer = "";
            } else {
                buffer += row.DELIM
            }
        }
        rowWriter.writeRow({VALUE: s[i]})
    },
}
$$;

select VALUE from 
table(split_to_table2('Car > Bike,Bike > Scooter,Scooter > Sprinting, Jogging and Walking,Walking > Flying', ',', '>'))
;

输出量:
| 价值|
| - -|
| 汽车〉自行车|
| 自行车〉滑板车|
| 踏板车〉短跑、慢跑和步行|
| 行走〉飞行|
此UUTF比内置表函数split_to_table中的两个参数多添加一个参数。第三个参数ROW_MUST_CONTAIN是行必须包含的字符串。它在DELIM上拆分字符串,但如果它没有ROW_MUST_CONTAIN字符串,它连接字符串以形成行的完整字符串。在本例中,我们只指定,作为分隔符,>作为ROW_MUST_CONTAIN。

gkn4icbw

gkn4icbw2#

我们可以巧妙地使用regexp_replace,在拆分表之前将实际的分隔符替换为其他内容。我使用的是双管道'||',但您可以将其更改为其他内容。'\|\|\\1'技巧称为反向引用,它允许我们将捕获的组(\\1)作为替换(\|\|)的一部分包含在内。

set str='car>bike,bike>car,truck, and jeep,horse>cat,truck>car,truck, and jeep';

select $str, *
from table(split_to_table(regexp_replace($str,',([^>,]+>)','\|\|\\1'),'||'))
pnwntuvh

pnwntuvh3#

是的,你是对的。我能看到的唯一模式是逗号后面有空格的模式。
这是一个小的变通方法,但我们可以利用这种模式。在下面的代码中,我替换了逗号,后面有空格。然后我对表函数应用split,并将之前的替换转换回来。
如果字符串包含“my_replacement”或任何其他新模式,它并不十分漂亮,而且会崩溃,但它对我很有效:

select replace(t.value, 'my_replacement', ', ') 
from table(
           split_to_table(replace('Car > Bike,Bike > Scooter,Scooter > Sprinting, Jogging and Walking,Walking > Flying', ', ', 'my_replacement'),',')) t

相关问题