如何将格式化为CSV的BLOB导入postgres

时间:2017-04-18 12:34:22

标签: postgresql blob postgresql-9.4

我有一个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`

1 个答案:

答案 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)