2017-04-26 1 views
0

Ich habe ein Problem mit einigen CSV-Dateien kommend von einem weichen und die ich verwenden möchte, um PostgreSQL-Import (Funktion COPY FROM CSV). Das Problem ist, dass einige letzten Spalten wie dieser (für Header, die Zahl für Werte Brief, _ für die TAB-Trennzeichen) fehlen:Wie puffe ich CSV-Datei fehlende Spalten

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 VON file.csv Ergebnis: ERROR: fehlenden Daten für Spalte "d"

Beispiel für eine korrekte Datei für den Import:

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 

Meine Frage: gibt es einige Befehle in der bash/linux-Shell die TAB-Trennzeichen, um eine korrekte/COML hinzufügen ete/gepolsterte CSV-Datei mit allen Spalten.

Danke für Hilfe.

+0

können Sie csv eine Spalte Tabelle kopieren und dann in my_table einfügen daraus Daten begrenzt –

Antwort

1

Ok, also in der Tat finde ich:

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

wo 50 die Zahl der TAB + 1

1

Sie können eine Kombination von sed und regulären Ausdrücke verwenden:

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

Sie brauchen nur _ von Ihrem Begrenzer (\t) zu ersetzen.

2

Awk ist gut dafür.

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

Sie wußte nicht viel über Linux, aber dies leicht in postgresql über einfachen Befehl wie

copy tableName from '/filepath/name.csv' delimiter '_' csv WITH NULL AS 'null'; 
1

Perl hat einen CSV Modul getan werden könnte, was sehr praktisch sein könnte sogar noch komplizierter CSV-Fehler zu beheben . Auf meinem Ubuntu Testsystem ist es Teil des Paketes libtext-csv-perl.

Dies behebt das Problem:

#! /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); 
} 

ändern sep_char zu "\t", wenn Sie einen Tabulator getrennte Datei haben und bedenken Sie, dass Perl "\t" und '\t' anders behandelt.

Verwandte Themen