如何填充CSV文件缺少列

时间:2017-04-26 13:52:25

标签: linux bash postgresql shell csv

我遇到一些来自软件的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文件。

感谢您的帮助。

5 个答案:

答案 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'