我有一个csv文件,它是BLOB商店的输出。 csv包含6个相关表。并非所有记录都使用6个表,但所有记录都使用表1.我想将表1导入postgres。数据描述如下
文件是ASCII文本文件,包含由星号分隔的可变长度字段。这些文件的扩展名为“csv”。记录由回车/换行分隔。没有数据项应包含星号。
技术安排中提供了进一步的信息。
技术安排
我们的摘要数据的技术安排如下: 字段的顺序与它们在此文件规范中列出的顺序相同。 记录分为类型。每种类型代表记录的不同部分。 每条记录都以Type'01'数据开头 对于每个记录类型'01',有一个或多个记录类型'02'包含测量行项目数据。可能有零个或多个记录类型'03'和'06'。 可能有零个或一个记录类型'04'和'05'。 如果存在记录类型“06”,则会有一个记录类型“07” 记录的结尾仅由类型'01'数据的下一行或文件的末尾指示。 您应该使用此信息将文件读入正式数据结构。
我是数据库的新手,想要知道如何解决这个问题,我知道postgres有python和java连接器,而这些连接器又有读取blob数据的方法。这是最好的方法吗?
EDIT 样本数据,一个条目包含2个记录类型,然后1个包含所有7个记录类型;
01*15707127000*8227599000*0335*The Occupier*3****MARKET STREET**BRACKNELL*BERKS*RG12 1JG*290405*Shop And Premises*60.71*14872*14872*14750*2017*Bracknell Forest*00249200003001*20994339144*01-APR-2017**249*NIA*330.00
02*1*Ground*Retail Zone A*29.42*330.00*9709
02*2*Ground*Retail Zone B*31.29*165.00*5163
01*15707136000*492865165*0335**7-8****CHARLES SQUARE**BRACKNELL*BERKS*RG12 1DF*290405*Shop And Premises*325.10*34451*32921*32750*2017*Bracknell Forest*00215600007806*21012750144*01-APR-2017**249*NIA*260.00
02*1*Ground*Retail Zone A*68.00*260.00*17680
02*2*Ground*Remaining Retail Zone*83.50*32.50*2714
02*3*Ground*Office*7.30*26.00*190
02*4*First*Locker Room (Female)*3.20*13.00*42
02*5*First*Locker Room (Male)*5.80*13.00*75
02*6*First*Mess/Staff Room*11.50*13.00*150
02*7*Ground*Internal Storage*7.80*26.00*203
02*8*Ground*Retail Zone B*68.10*130.00*8853
02*9*Ground*Retail Zone C*69.90*65.00*4544
03*Air Conditioning System*289.5*7.00*+2027
06*Divided or split unit*-5.00%
06*Double unit*-5.00%
07*36478*-3557`
答案 0 :(得分:2)
将文本文件复制到具有单个文本列的辅助表:
drop table if exists text_buffer;
create table text_buffer(text_row text);
copy text_buffer from '/data/my_file.csv';
将文本列转换为跳过不需要的行的文本数组。您将能够选择任何元素作为具有给定名称和类型的新列,例如:
select
cols[2]::bigint as bigint1,
cols[3]::bigint as bigint2,
cols[4]::text as text1,
cols[5]::text as text2
-- specify name and type of any column you need
from text_buffer,
lateral string_to_array(text_row, '*') cols -- transform text column to text array
where left(text_row, 2) = '01'; -- get only rows for table1
bigint1 | bigint2 | text1 | text2
-------------+------------+-------+--------------
15707127000 | 8227599000 | 0335 | The Occupier
15707136000 | 492865165 | 0335 |
(2 rows)