2017-04-26 60 views
0

我有一些CSV文件来自软件,我想用来使PostgreSQL导入(功能COPY从CSV)的问题。问题是,一些最后一栏缺少这样的(函头,数量值,_为TAB分隔符):如何填充CSV文件丢失列

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结果是: 错误:缺少数据列“d”一个正确的文件中导入

样品:

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分隔符来做出正确的/ COML ete /填充所有列的csv文件。

感谢您的帮助。

+0

您可以复制CSV到一个列的表,然后插入MY_TABLE从中分隔数据 –

回答

1

好了,其实我觉得这样的:

awk -F'\t' -v OFS='\t' 'NF=50' input.csv > output.csv 

,其中50是TAB的数量+ 1

1

您可以使用sed和正则表达式的组合:

sed -r 's/^[0-9](_[0-9]){2}$/\0_/g' file.csv 

你只需要通过您的分隔符(\t)取代_

2

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 
2

不知道很多关于Linux,但这个可以在PostgreSQL中通过简单的命令很容易做到像

copy tableName from '/filepath/name.csv' delimiter '_' csv WITH NULL AS 'null'; 
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'不同。