質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

1405閲覧

【PostgreSQL】COPYコマンドでCSVファイルを取り込むと数値の後ろの空白が足りずに追加されるのは何故ですか

koburon

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2023/03/02 12:56

編集2023/03/03 00:30

前提

VBAのマクロで作成したCSVファイルを、PostgreSQLの社員マスタにCOPYコマンドでインポートします。下記URLを参考にして作成しました。
【超簡単】ワンタッチでエクセルからCSV出力するVBAプログラム
PostgreSQLでCSVファイルをインポート/エクスポートする方法

該当のソースコード

社員マスタのテーブルです。文字型は全てcharacterです。

t_社員マスタ

1CREATE TABLE public."t_社員マスタ" ( 2 "社員番号" character(8) NOT NULL, 3 "氏名" character(16), 4 "氏名カナ" character(24), 5 "所属コード" character(3), 6 "所属" character(30), 7); 8ALTER TABLE ONLY public."t_社員マスタ" 9 ADD CONSTRAINT "pk_t_社員マスタ" PRIMARY KEY ("社員番号");

作成したCSVファイルです。

社員番号氏名氏名カナ所属コード所属
12345田中太郎タナカ タロウ025本社総務部

発生している問題

一度CSVをExcelで開き、「名前を付けて保存」⇒「CSV UTF-8(コンマ区切り)」で保存をしました。
そして、再びCOPYコマンドを実行したところ、社員番号で主キー制約しているので重複する社員番号は追加されないはずですが、実行されレコードが追加されてしまいました。

t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"12345□□□"になるはずだと想定していました。

ところが、COPY実行後追加されたレコードを確認したところ、"12345□□"と7文字になっていました。

実現したいこと

5ケタの数字の後ろの3文字分埋めるようにしたいです。

CSVを作成する段階で固定長を8文字に設定するツールがあるのか、COPYコマンドで必要な設定が抜けているのか、アドバイスいただけると幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
Excelのバージョン:Microsoft365 Excel
PostgreSQLのバージョン:9.0.1
PSqlEditのバージョン:5.2.3.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2023/03/03 00:01

>COPY実行後追加されたレコード確認したところ、"12345□□"と7バイトになっていました。 どのようにして、そのことを確認されたのでしょうか。 PSqlEditで select * from t_社員マスタ; で表示させたのでしょうか。
koburon

2023/03/03 00:25 編集

はい、select文で表示させた後、レコードの'12345'をコピーして貼り付けしたところ、'12345□□'と後ろが2文字だけになっていました。
tatsu99

2023/03/03 01:05 編集

こちらで、再現試験をおこなったのですが、再現しませんでした。 1.下記をCOPYコマンドでDBへコピー(OK) "18880","羽田","ハネダ","100","SECT1","10","BRANCH1","YAKU1" 2.下記をCOPYコマンドでDBへコピー(全てNG) "18880","羽田1","ハネダ","100","SECT1","10","BRANCH1","YAKU1" "18880□","羽田2","ハネダ","100","SECT1","10","BRANCH1","YAKU1" "18880□□","羽田3","ハネダ","100","SECT1","10","BRANCH1","YAKU1" "18880□□□","羽田4","ハネダ","100","SECT1","10","BRANCH1","YAKU1" 3.タブ文字を最後につけて、CUPYコマンドを実行(OK) "18880□□<TAB>","羽田4","ハネダ","100","SECT1","10","BRANCH1","YAKU1" <TAB>は、タブ1文字です。 psqleditで表示すると、タブ文字なので18880□□□ のように見えます。 (□は半角の空白1文字) タブのような文字はべつとして、通常は右側の空白の数が違っても、postgresqlによって残り3桁分が空白になるように 調整されるので重複は発生しないはずです。 どのような、データを投入すると重複データが発生したのでしょうか?(タブなどは入ってないですね)
bsdfan

2023/03/03 01:54

Excelでutf-8のcsvを出すとBOM付きになると思うので、'12345□□' の先頭に表示されていないBOM(U+FEFF)がくっついてたりしないでしょうか?
koburon

2023/03/03 02:07

再現いただきありがとうございます。 試しに、社員番号5ケタの数字だけを残し、以外の全ての値を0にしたレコード "12345","0","0","0","0","0","0","0" をCOPYコマンドでインポートしたところ、"12345□□□"となるように調整されていました。 また、本題から少し外れているかもしれませんが、 COPY t_社員マスタ_マクロテスト from '/public/csv/UpdateMaster_20230303.csv'WITH CSV DELIMITER ','; これをwith以降のオプションを外して実行したところ、 ERROR: 値は型character(8)としては長すぎます というエラーが発生しました。 社員番号から右の値が長すぎるのが影響しているのでしょうか。
koburon

2023/03/03 02:13 編集

>bsdfan様 メモ帳でcsvを開いたところ、BOM付きになっているのを確認しました。 また、重複して入ってしまったあと、order by 社員番号で並び替えたところ、離れた場所になってしまいました。仰る通り、先頭にBOM(U+FEFF)がついているのかもしれません。 CSVを作成した後でBOMを除去することはできるのでしょうか。
tatsu99

2023/03/03 02:29

BOMの問題ですが、BOMがついていても、Postgresqlは正しく処理してくれます。 従って、BOMがついていることが問題ではないと考えます。 12345のあとに全角の空白などがついてないでしょうか。 12345□,氏名1,・・・① 12345△,氏名1,・・・② □は全角空白1文字、△は半角空白1文字とします。 ①のデータは重複なしなので登録されます。 ②のデータは重複ありなのでエラーとなります。 CSVファイルを全角空白と半角空白の違いが判るエディタで表示してみれば確認できるかと思います。
koburon

2023/03/03 02:30

CSVをメモ帳で開き、「名前を付けて保存」で文字コードを「UTF-8」にして保存しました。 保存したCSVをCOPYコマンドで実行した後社員番号を確認したところ、残り3桁分が空白になるように 調整されていました。 BOMを除去できたようです、ありがとうございました。
tatsu99

2023/03/03 03:38

こちらでも、同じ手順で再現しました。BOM付きが原因ですね。 とりあえず、暫定対策としては、 ①SJISのCSVファイルをメモ帳で読み込み、UTF8(BOM無)で保存し、それをCOPYコマンドで処理する。 になるかと思いますが、恒久対策としては、 ②SJISのCSVをCOPYコマンド処理できるようにする。 ③UTF8(BOM無)でCSVファイルを作成する。 ②については、下記でその方法が提示されています。 https://teratail.com/questions/9wwgqphswcflcw ③については、下記でその方法が提示されています。 https://teratail.com/questions/r35xkw19w4hwzh ②③のどちらかを試されてはいかがでしょうか。
koburon

2023/03/03 05:20

案を提示いただきありがとうございます。 本来ならCSVを作成するマクロでUTF8形式で保存するように記入したいところですが、文字化け等の問題でスルーしていました。 問題はひとまず解決できたので、今後はBOM除去の手間を省けるよう調整していきたいと思います。
guest

回答1

0

自己解決

コメントにも書いてくださった通り、先頭にBOMが付与されていることがエラーの原因でした。
CSVをメモ帳で開き、「名前を付けて保存」で文字コードを「UTF-8」(「UTF-8(BOM付き)」ではない)にして保存しました。
COPYコマンドで実行したところ、残り3桁分が空白になるように調整されていたので、
当面はこれでCSVを作成していこうと思います。
解決策のコメントをいただきありがとうございました。

投稿2023/03/03 05:22

koburon

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問