2017-04-26 56 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'不同。