将 JSON 文件导入 Postgres 16 数据库时出错(最后一个预期列之后的 22P04 额外数据)

Error importing JSON file into Postgres 16 Database (22P04 extra data after last expected column)

提问人:ChrisAsi71 提问时间:11/16/2023 最后编辑:ChrisAsi71 更新时间:11/16/2023 访问量:33

问:

所以我有以下文件“14.json”,我正在尝试将其导入到 postgres 16 数据库上的临时表中

现在我无法附加文件..但它的内容在这里:

14.json

{ "ChannelReadings": [
        { "ReadingsDto": [
                {
                    "Si": 47.67,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T12:57:43"
                },
                {
                    "Si": 47.22,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:02:43"
                },
                {
                    "Si": 47.6,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                },
                {
                    "Si": 47.5,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:12:43"
                }
            ],
            "ChannelId": 14
        },
        {
            "ReadingsDto": [
                {
                    "Si": 2.893605,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 12
        },
        {
            "ReadingsDto": [
                {
                    "Si": 3.294233,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 13
        },
        {
            "ReadingsDto": [
                {
                    "Si": 3.294233,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 16
        }
    ],
    "DeviceSerialNumber": "894339",
    "RestartPointerNo": 5514732,
    "NewDownloadTable": false,
    "DataHashDto": "5Mckxoq42EeLHmLnimXv6A=="
}

我导入此代码的代码如下:

DROP TABLE IF EXISTS tmp;

CREATE TEMP  table tmp (
      c TEXT
    );


COPY tmp FROM 'C:\ChrisDev\Readings\14.json';

但是,我收到以下错误:

[2023-11-16 12:44:32] [22P04] ERROR: extra data after last expected column
[2023-11-16 12:44:32] Where: COPY tmp, line 2: "        { "ReadingsDto": ["

我尝试编辑它,但无济于事 我在这里做错了什么?

sql json postgresql-16

评论

0赞 Frank Heikens 11/16/2023
您正在上传 CSV,并且此 CSV 的内容是 JSON。此文件中不同 json 的分隔符是什么?postgresql.org/docs/current/sql-copy.html
0赞 Zegarek 11/16/2023
FORMAT 选择要读取或写入的数据格式:文本csv(逗号分隔值)或二进制。默认值为 text您正在导入纯文本,默认格式是 ,所以这看起来应该有效。您确定您正在运行您共享的确切代码,而不是添加或在末尾?你有没有试过显式添加?textCSVWITH(FORMAT CSV)COPYWITH(FORMAT TEXT)
0赞 ChrisAsi71 11/16/2023
加载的文件不是CSV文件。它是一个 JSON 文件。该文件名为 14.json...我无法将它附加到这篇文章中,但它在这篇文章的开头输出
0赞 ChrisAsi71 11/16/2023
@Zegarek我确实尝试过 With(格式化 CSV),但遇到了同样的错误: [2023-11-16 15:17:06] [22P04] 错误:最后一个预期列后的额外数据 [2023-11-16 15:17:06] 其中:COPY tmp,第 2 行:“ { ”ReadingsDto“: [”
0赞 Zegarek 11/16/2023
尝试 ,而不是 csv。WITH(FORMAT TEXT)

答:

0赞 Zegarek 11/16/2023 #1

您的文件中可能有选项卡,这对复制来说是不幸的......格式化文本(默认行为),因为另一个默认设置配置为使用制表符:copydelimiter

FORMAT选择要读取或写入的数据格式:、(逗号分隔值)或 。缺省值为 。textcsvbinarytext

DELIMITER指定用于分隔文件每行(行)内列的字符。默认值为文本格式的制表符,格式为逗号。这必须是单个单字节字符。使用格式时不允许使用此选项。CSVbinary

要解决此问题,请尝试使用另一个分隔符:

DROP TABLE IF EXISTS tmp;
CREATE TEMP  table tmp (c TEXT );
COPY tmp FROM 'C:\ChrisDev\Readings\14.json' WITH (FORMAT TEXT, DELIMITER '~');

评论

1赞 ChrisAsi71 11/16/2023
我试过了,效果很好!你是对的。我的文件中可能确实有选项卡。我能够将我的文件加载到临时表中,然后进行选择,以原始格式返回 JSON!非常感谢你。