gpt4 book ai didi

postgresql - 当双引号内有\n(换行符)时,如何使用 pgloader 或 PostgreSQL 副本解析 CSV?

转载 作者:行者123 更新时间:2023-11-29 13:48:40 31 4
gpt4 key购买 nike

我有这样的 csv 行:

"aaa"|"bbb"|"ccc"|"dddd
eeeee"

我想使用 pgloader ( http://pgloader.io/ ) 或 PostgreSQL COPY ( https://www.postgresql.org/docs/9.6/static/sql-copy.html ) 导入这些数据。我的问题是,根据 CSV 标准,在引用的字段值内可能有换行符 (\n)。但是 pgloader 和 COPY 命令将其视为一个全新的数据行,而不是一个内部有换行符的列。

COPY schema.table (
col_aaa,
col_bbb,
col_ccc,
col_ddd
)
FROM 'file.csv' WITH DELIMITER '|' ENCODING 'LATIN1' CSV;

我的复制命令我的 pgloader 命令

LOAD CSV
FROM 'file.csv'
INTO postgresql://user:password@host:5432/database?schema.table (col_aaa, col_bbb, col_ccc, col_ddd)

WITH
skip header = 0,
fields optionally enclosed by '"',
fields escaped by double-quote,
fields terminated by '|'

SET client_encoding to 'latin1'
BEFORE LOAD DO
$$ TRUNCATE anac.aerodromos_csv RESTART IDENTITY; $$;

我从 PostgreSQL 文档和谷歌中搜索了很多。

我唯一发现的是:Parsing CSV file with \n in double quoted fields但是 awk 对于超过 100 万行的文件来说太慢了。

关于如何做的任何提示?

我更喜欢 pgloader,但我可以接受使用 sed 或 perl 作为正则表达式代理在 linux shell 脚本中处理文件。

关于如何做的任何线索?

最佳答案

为了给你解决这个问题的想法,我写了这个例子。

我刚刚假设文件将只包含 4 列并且只包含 1 个换行符。如果不是这种情况,那么您需要更改它。

输入文件:

"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"dddd
eeeee"
"aaa"|"bbb"|"cc
c"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"b
bb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"a
aa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"dddd
eeeee"

script.pl

#!/usr/bin/perl
use strict; use warnings; use Data::Dumper;

open ( my $RFH, '<', 'input.io' ) or die ($!);
open ( my $WFH, '>', 'output.o' ) or die ($!);

my $line_break = 0;
my $old_line = '';

while ( my $line = <$RFH> ) {
chomp($line);
if ( ! $line_break ){
my @columns = split( /\|/, $line );
if ( scalar( @columns ) == 4 && $columns[3] =~ m/"$/ ){
print $WFH $line."\n";
}
else{
$line_break = 1;
$old_line = $line;
next;
}
}
else{
$line = $old_line . $line;
$old_line = '';
$line_break = 0;
print $WFH $line."\n";
}
}

close($RFH);
close($WFH);

输出文件:

"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"
"aaa"|"bbb"|"ccc"|"ddddeeeee"

根据您的需要更改此示例。希望这会有所帮助。

关于postgresql - 当双引号内有\n(换行符)时,如何使用 pgloader 或 PostgreSQL 副本解析 CSV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44419059/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com