【发布时间】:2020-12-21 16:58:01
【问题描述】:
希望你没事,
我想读取 /home/BNP/File.csv 中存在的 csv 文件
我的文件 1 包含 3 列 COL_、COL1 和 COL2。 我的数据示例
SCHOOLAA/Fourniture/pencil, SCHOOL, SCHOOL
HOMEAA/Fourniture/desk, HOME OFFICE, HOME
HOMEAA/Fourniture/, HOME, FOURNITURE
我的数据库表 dab 的值:
id, COL_
221323, SCHOOL12/Fourniture/pencil
221324, SCHOOL13/Fourniture/pencil
221325, HOME00/Fourniture/desk
221326, SCHOOL14/Fourniture/pencil
221327, HOME01/Fourniture/
221328, HOME04/Fourniture/
我想创建包含三列 COL_、COL1、COL2 的表 dabres。
**Result:**
**COL_ COL1 COL2**
SCHOOL12/Fourniture/pencil. , SCHOOL, SCHOOL
SCHOOL13/Fourniture/pencil. , SCHOOL, SCHOOL
HOME00/Fourniture/desk ,HOME OFFICE, HOME
SCHOOL14/Fourniture/pencil ,SCHOOL, SCHOOL
HOME01/Fourniture/ ,HOME, FOURNITURE
HOME04/Fourniture/ ,HOME, FOURNITURE
我在下面做了一个尝试,我如何在读取文件时动态地做到这一点。让我们注意到我的 File.csv 包含 50 行,因此逐个吃起来不太容易。
代码
execute $$
INSERT INTO $$||new_table_name||$$
(COL_, COL1, COL2)
SELECT * from (
(case
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/desk/'
then HOME OFFICE
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/pencil/'
then 'SCHOOL'
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/'
then 'HOME'
else 'NONE'
end) as COL1,
(case
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/desk/'
then HOME
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/pencil/'
then 'SCHOOL'
when TRIM(COL_) ~ '^SCHOOL[0-9]{2}/Fourniture/'
then 'FOURNITURE'
else 'NONE'
end) as COL2
)
最好的问候, 谢邀!!
【问题讨论】:
-
为什么不把
CREATE TABLE dabres(COL_ varchar,COL1 varchar, COL2 varchar) and thenCOPY` csv 放进去呢? -
不,也许我不清楚。如果 col_ of dab='VALUE',我的文件 FIL1.txt 只是为了查看 COL1 和 COL2 应该包含的内容。你明白我的意思吗?请告诉我如果我不清楚@AdrianKlaver
-
不,我没有。你说你想阅读或迭代
File.csv中的 50 行。我看不到dab和dabres之间的关系,因为我看不到dab.id正在被使用。 -
dabres 是 dab 的新表,其中映射了新列。是的,你是对的,我只是忘记在我的代码中添加 dab.id。我还是不清楚,? @AdrianKlaver
-
在我看来,CSV 中的“AA”代表某种用于加入
dab表的通配符。可能最容易将dab中的数字“屏蔽”为通配符,例如将 csv 加载到dabtemp并加入ON REGEXP_REPLACE(dab.CSV_,'[0-9]{2}/','AA/')=dabtemp.CSV_
标签: sql postgresql plpgsql