我遇到一些来自软件的CSV文件的问题,我想用它来进行PostgreSQL导入(函数COPY FROM CSV)。问题是最后一些列丢失了(标题的字母,值的数字,TAB分隔符的_):
a_b_c_d
1_2_3_4
5_6_7 <- last column missing
8_9_0_1
2_6_7 <- last column missing
COPY in_my_table FROM file.csv结果是: 错误:列&#34; d&#34;
缺少数据要导入的正确文件的示例:
a_b_c_d
1_2_3_4
5_6_7_ <- null column but not missing
8_9_0_1
2_6_7_ <- null column but not missing
我的问题:bash / linux shell中是否有一些命令可以添加TAB分隔符,以便为所有列生成正确的/ comlete / padded csv文件。
感谢您的帮助。
答案 0 :(得分:2)
对linux知之甚少,但这可以通过像
这样的简单命令在postgresql中轻松完成copy tableName from '/filepath/name.csv' delimiter '_' csv WITH NULL AS 'null';
答案 1 :(得分:2)
好的,所以实际上我发现了这个:
awk -F'\t' -v OFS='\t' 'NF=50' input.csv > output.csv
其中50是TAB + 1的数量
答案 2 :(得分:1)
您可以使用sed和正则表达式的组合:
sed -r 's/^[0-9](_[0-9]){2}$/\0_/g' file.csv
您只需要用分隔符_
替换\t
。
答案 3 :(得分:1)
Awk对此有好处。
awk -F"\t" '{ # Tell awk we are working with tabs
if ($4 =="") # If the last field is empty
print $0"\t" # print the whole line with a tab
else
print $0 # Otherwise just print the line
}' your.csv > your.fixed.csv
答案 4 :(得分:1)
Perl有一个CSV模块,可以方便地修复更复杂的CSV错误。在我的Ubuntu测试系统上,它是包libtext-csv-perl
。
这可以解决您的问题:
#! /usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new ({ binary => 1, eol => $/, sep_char => '_' });
open my $broken, '<', 'broken.csv';
open my $fixed, '>', 'fixed.csv';
while (my $row = $csv->getline ($broken)) {
$#{$row} = 3;
$csv->print ($fixed, $row);
}
如果您有制表符分隔文件,请将sep_char
更改为"\t"
,并请注意Perl会以不同方式处理"\t"
和'\t'
。