CSVをpsqlから取り込む

日付 2016.02.03
タイトル CSVをpsqlから取り込む
本文
Excelカンマ区切り形式のCSVをPostgreSQLのpsqlコマンドから取り込みます。

# Excelカンマ区切り形式CSV in.csv を test_db の user_m テーブルの項目 user_id, user_name, new_stamp, new_client に取り込みます。
# 一行目は項目名が入っていると仮定します。
cat in.csv | perl -e '
print "begin;
set client_encoding to sjis;
copy user_m (user_id, user_name, new_stamp, new_client) from stdin;
";

$on = undef;
$line = "";
$i = 0;
while (<STDIN>) {
  $line .= $_;
  ($on = ($on && m/(?<![^"]")"(,|\r?\n|$)/) ? undef
    : ((!$on && m/((?:^|,)"(?:""|[^"])*(?<![^"]")(,|\r?\n|$))/) ? 1 : $on)) && next;
  if ($i++ == 0) {
    $line = "";
    next;
  }
  $line =~ s/(\r\n|\r|\n)$//;
  @cols = ();
  while ($line =~ m/(?:^|,)(?:"((?:""|[^"])*)"|([^",]*))(?=,|)/mg) {
    $val = "";
    if (defined()) {
      $val = ;
    } else {
      $val = ,;
      $val =~ s/""/"/g;
    }
    $val =~ s/\r/\r/g;
    $val =~ s/\n/\n/g;
    $val =~ s/\t/\t/g;
    push(@cols, $val);
  }
  $line = "";
  print join("\t", @cols)."\n";
}
print "\.
commit;";
' | psql -U postgres -d test_db