如何将Blob格式化为CSV,以便向Postgres导入



我有一个CSV文件,该文件是Blob Store的输出。CSV包含6个相关表。并非所有记录都使用6个表,但是所有记录都使用表1。我想将表1导入Postgres。数据被描述为以下

文件是ASCII文本文件,其中包含星号界定的可变长度字段。这些文件具有" CSV"的扩展名。记录通过马车返回/线供稿分开。没有数据项应包含星号。

在技术安排中提供了更多信息。

技术安排

我们的摘要数据的技术安排如下: 字段处于此文件规范中列出的确切顺序。 记录分为类型。每种类型代表记录的不同部分。 每个记录将以" 01"数据开头 对于每个记录类型的" 01",都有一个或多个记录类型的" 02"包含调查行项目数据。记录类型的03'和" 06"可能零或更多。 可能有零或记录类型的" 04"one_answers" 05"之一。 如果存在记录类型的" 06",将有一种记录类型'07' 记录的结尾仅由下一行" 01"数据或文件末尾表示。 您应该使用此信息将文件读为正式的数据结构。

我是数据库的新手,想知道如何解决这个问题,我知道Postgres拥有Python和Java连接器,这些连接器又有方法可以读取BLOB数据。那是最好的方法吗?

编辑样本数据,一个条目,包括2种记录类型,然后包含所有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`

将文本文件复制到带有单个文本列的辅助表:

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)

最新更新