如何从TXT文件中提取JSON?

时间:2019-12-03 19:04:35

标签: json postgresql data-ingestion

问题不是因为TXT是

SELECT to_jsonb(file_get_contents('/tmp/test.json'))

不是返回JSON对象,而是返回一个字符串...即使使用replace(txt,E'\n',' '),它也不起作用。如何规范化字符串并将其真正转换为JSON?

PS:我正在使用JSONb,它必须像JSON一样可用于提取。


注释

json文件/tmp/test.json

[
    {
      "foo": "etc",
      "bar": "etc",
      "x": 123
    },
    {
      "foo": "aaa",
      "bar": "bbb",
      "x": 456
    }
]

我正在使用UBUNTU 18 LTS,PostgreSQL v12和Linux标准TXT中的文件。终端命令file -i /tmp/test.json说,这很好,“ text / plain; charset = utf-8”。

要将全文只加载到一个字段中(对于COPY FROM来说似乎是不可能的),PostgreSQL很难看,但是此功能已经过测试并且可靠:

CREATE EXTENSION PLpython3U;
CREATE or replace FUNCTION file_get_contents(p_file text) RETURNS text AS $$
   import os.path
   if not os.path.isfile(args[0]):
       return None
   with open(args[0],"r") as content_file:
       content = content_file.read()
   return content
$$ LANGUAGE PLpython3U;

2 个答案:

答案 0 :(得分:1)

使用postgresql,我将您的文件保存到了/tmp目录中。

要读取文件,如果文件在您的Postgresql服务器上,则可以使用pg_read_file()

为模拟您的情况,我尝试了以下操作:

方法1(json_array_elements_text):

SELECT JSON_ARRAY_ELEMENTS_TEXT(
       REPLACE(PG_READ_FILE('/tmp/teste.txt'), E'\n', '')::JSON);

除了您在服务器上读取文件的pg_read_filejson_array_elements_text以外,这一系列功能与您使用的功能非常相似。

结果是:

                  json_array_elements_text                  
------------------------------------------------------------
 {      "foo": "etc",      "bar": "etc",      "x": 123    }
 {      "foo": "aaa",      "bar": "bbb",      "x": 456    }
(2 rows)

方法2(json_to_recordset):

select * from json_to_recordset(replace(pg_read_file('/tmp/teste.txt'), E'\n', '')::json) as ("foo" varchar, "bar" varchar, "x" int);
 foo | bar |  x  
-----+-----+-----
 etc | etc | 123
 aaa | bbb | 456
(2 rows)

结果与第一个示例相似,但是在这种方法中,我们根据原始json数据上的元素定义列

答案 1 :(得分:1)

它已经是JSON格式,您只需要强制转换即可:

SELECT file_get_contents('/tmp/test.json')::jsonb

“ to_json”文档说

  

对于除数字,布尔值或空值以外的任何标量类型,   文字表示形式将以   有效的json或jsonb值。

换句话说,它执行转义和引用操作,以将文件转换为单个JSON值。不是JSON对象,只有一个值。因此,“ to_json”是该工作的错误工具。