質問編集履歴

3

タイトルが正しくなかったので修正

2023/03/03 00:30

投稿

koburon
koburon

スコア30

test CHANGED
@@ -1 +1 @@
1
- 【PostgreSQL】COPYコマンド実行後CSVファイルの空白部分欠けているのは何故ですか
1
+ 【PostgreSQL】COPYコマンドCSVファイルを取り込むと数値後ろの空白が足りずに追加されるのは何故ですか
test CHANGED
File without changes

2

サンプルを修正。

2023/03/03 00:21

投稿

koburon
koburon

スコア30

test CHANGED
File without changes
test CHANGED
@@ -19,15 +19,15 @@
19
19
  作成したCSVファイルです。
20
20
  |社員番号|氏名|氏名カナ|所属コード|所属|
21
21
  |:--|:--:|:--:|:--:|:--:|
22
- |11111|田中太郎|タナカ タロウ|025|本社総務部||
22
+ |12345|田中太郎|タナカ タロウ|025|本社総務部||
23
23
 
24
24
  ### 発生している問題
25
25
  一度CSVをExcelで開き、「名前を付けて保存」⇒「CSV UTF-8(コンマ区切り)」で保存をしました。
26
26
  そして、再びCOPYコマンドを実行したところ、社員番号で主キー制約しているので重複する社員番号は追加されないはずですが、実行されレコードが追加されてしまいました。
27
27
 
28
- t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"11111□□□"になるはずだと想定していました。
28
+ t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"12345□□□"になるはずだと想定していました。
29
29
 
30
- ところが、COPY実行後追加されたレコードを確認したところ、"11111□□"と7文字になっていました。
30
+ ところが、COPY実行後追加されたレコードを確認したところ、"12345□□"と7文字になっていました。
31
31
 
32
32
  ### 実現したいこと
33
33
  5ケタの数字の後ろの3文字分埋めるようにしたいです。

1

プログラムとは関係ないとのことなので削除、その他文章を修正。

2023/03/03 00:11

投稿

koburon
koburon

スコア30

test CHANGED
@@ -1 +1 @@
1
- 【PostgreSQL】COPYコマンドで主キー制約下でも重複したレコード追加されしま
1
+ 【PostgreSQL】COPYコマンド実行後CSVファイルの空白部分欠けているのは何故で
test CHANGED
@@ -11,101 +11,28 @@
11
11
  "氏名カナ" character(24),
12
12
  "所属コード" character(3),
13
13
  "所属" character(30),
14
- "支社コード" character(3),
15
- "支社" character(20),
16
- "役職名" character(30),
17
14
  );
18
15
  ALTER TABLE ONLY public."t_社員マスタ"
19
16
  ADD CONSTRAINT "pk_t_社員マスタ" PRIMARY KEY ("社員番号");
20
17
  ```
21
- 全てのセル値を「""」で囲んでCSV出力するコードです。
22
- ```VBA
23
- Public Sub writeCSV()
24
- Dim ws As Worksheet
25
- Dim maxrow As Long
26
- Dim fileNo As Integer
27
- Dim wrow As Long
28
- Dim wcol As Long
29
- Dim i As Long
30
- Dim val As String
31
- Dim out_line As String
32
- Const stCol = 1
33
- Const enCol = 144
34
- Dim arrVal(enCol - stCol) As String
35
- Set ws = Worksheets("Sheet1")
36
- maxrow = ws.Cells(Rows.Count, 1).End(xlUp).Row
37
- fileNo = FreeFile
38
-
39
- ' ワークシートに出力している間の画面更新を停止
40
- Application.ScreenUpdating = False
41
-
42
- ' ----------------------------
43
- ' ファイルの出力処理
44
- ' ----------------------------
45
- Dim myFileName, fileName, fileDateNm As String
46
-
47
- ' ファイル名を作成する
48
- fileDateNm = Replace(CStr(Date), "/", "")
49
- fileName = "UpdateMaster_" & fileDateNm
50
- ' ダイアログ表示
51
- myFileName = Application.GetSaveAsFilename(InitialFileName:=fileName, FileFilter:="CSV ファイル (*.csv),*.csv")
52
- ' キャンセルなら終了
53
- If myFileName = "False" Then
54
- Exit Sub
55
- End If
56
-
57
- ' 保存
58
- Open myFileName For Output As #fileNo
59
- For wrow = 3 To maxrow
60
- i = 0
61
- For wcol = stCol To enCol
62
- ' 1データ取得
63
- val = ws.Cells(wrow, wcol).Value
64
- ' データをダブルクオートでくくり、配列へ格納
65
- arrVal(i) = wrap_data(val)
66
- i = i + 1
67
- Next
68
- ' カンマで連結
69
- out_line = Join(arrVal, ",")
70
- Print #fileNo, out_line
71
- Next
72
- Close #fileNo
73
-
74
- MsgBox ("CSVファイルを「Shift_JIS」で出力しました。レコード部分のみ出力しています。")
75
-
76
- ' 画面更新を元に戻す
77
- Application.ScreenUpdating = True
78
- End Sub
79
18
 
19
+ 作成したCSVファイルです。
80
- ' 入力文字列をダブルクオトでくくる
20
+ |社員番号|氏名|氏名カナ|所属コド|所属|
81
- Private Function wrap_data(ByVal val As String) As String
82
- wrap_data = """" & val & """"
83
- End Function
84
- ```
85
- CSVファイルをインサートするCOPYコマンドです。
21
+ |:--|:--:|:--:|:--:|:--:|
86
- ```PostgreSQL
87
- COPY t_社員マス from '/public/csv/UpdateMaster_20230302.csv' ;
22
+ |11111|田中太郎|タナカロウ|025|本社総務部||
88
- ```
89
23
 
90
- ### 発生している問題・試したこと
24
+ ### 発生している問題
91
- CSVファイルは問題なく出力されますが、COPYコマンド実行時、以下の構文エラーが発生しました。
92
- ```
93
- COPY t_社員マスタ from '/public/csv/UpdateMaster_20230302.csv'
94
- ERROR: 符号化方式"UTF8"で無効なバイトシーケンスです: 0x8d
95
- CONTEXT: t_社員マスタのCOPY。行番号 1
96
- ```
97
- このエラーを解消するため、一度CSVをExcelで開き、
98
- 「名前を付けて保存」⇒「CSV UTF-8(コンマ区切り)」で保存をしました。
25
+ 一度CSVをExcelで開き、「名前を付けて保存」⇒「CSV UTF-8(コンマ区切り)」で保存をしました。
99
- そして、再びCOPYコマンドを実行したところ、本来なら主キー制約で社員番号が重複するレコードに対してエラーが発生するはずが、実行されレコードが追加されてしまいました。
26
+ そして、再びCOPYコマンドを実行したところ、社員番号で主キー制約しているの重複する社員番号は追加されないはですが、実行されレコードが追加されてしまいました。
100
27
 
101
- t_社員マスタの"社員番号"は固定長の8バイトすが、全て5ケタの半角数字で後ろの3バイト分が空文字で埋まるようになっていま
28
+ t_社員マスタの"社員番号"は8文字の固定長文字列型あり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"11111□□□"になるはずだと想定していした
102
- CSVで追加するレコードの社員番号は"12345"なので、本来は"12345□□□"となり、重複エラーが起きるようにしたいのですが、
29
+
103
- COPY実行後追加されたレコード確認したところ、"12345□□"と7バイトになっていました。
30
+ ところが、COPY実行後追加されたレコード確認したところ、"11111□□"と7文字になっていました。
104
31
 
105
32
  ### 実現したいこと
106
- 5ケタの数字の後ろの3バイト分を空文字埋めるようにしたいです。
33
+ 5ケタの数字の後ろの3文字埋めるようにしたいです。
107
34
 
108
- CSVを作成する段階で固定長を設定するツールがあるのか、COPYコマンドで必要な設定がるのかのか、アドバイスいただけると幸いです。
35
+ CSVを作成する段階で固定長を8文字に設定するツールがあるのか、COPYコマンドで必要な設定が抜けているのか、アドバイスいただけると幸いです。
109
36
  よろしくお願いいたします。
110
37
 
111
38
  ### 補足情報(FW/ツールのバージョンなど)