質問編集履歴
3
タイトルが正しくなかったので修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
【PostgreSQL】COPYコマンド
|
1
|
+
【PostgreSQL】COPYコマンドでCSVファイルを取り込むと数値の後ろの空白が足りずに追加されるのは何故ですか
|
test
CHANGED
File without changes
|
2
サンプルを修正。
test
CHANGED
File without changes
|
test
CHANGED
@@ -19,15 +19,15 @@
|
|
19
19
|
作成したCSVファイルです。
|
20
20
|
|社員番号|氏名|氏名カナ|所属コード|所属|
|
21
21
|
|:--|:--:|:--:|:--:|:--:|
|
22
|
-
|1
|
22
|
+
|12345|田中太郎|タナカ タロウ|025|本社総務部||
|
23
23
|
|
24
24
|
### 発生している問題
|
25
25
|
一度CSVをExcelで開き、「名前を付けて保存」⇒「CSV UTF-8(コンマ区切り)」で保存をしました。
|
26
26
|
そして、再びCOPYコマンドを実行したところ、社員番号で主キー制約しているので重複する社員番号は追加されないはずですが、実行されレコードが追加されてしまいました。
|
27
27
|
|
28
|
-
t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"1
|
28
|
+
t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"12345□□□"になるはずだと想定していました。
|
29
29
|
|
30
|
-
ところが、COPY実行後追加されたレコードを確認したところ、"1
|
30
|
+
ところが、COPY実行後追加されたレコードを確認したところ、"12345□□"と7文字になっていました。
|
31
31
|
|
32
32
|
### 実現したいこと
|
33
33
|
5ケタの数字の後ろの3文字分埋めるようにしたいです。
|
1
プログラムとは関係ないとのことなので削除、その他文章を修正。
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
|
-
|
21
|
+
|:--|:--:|:--:|:--:|:--:|
|
86
|
-
```PostgreSQL
|
87
|
-
|
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_社員マスタの"社員番号"は固定長
|
28
|
+
t_社員マスタの"社員番号"は8文字の固定長文字列型であり、全て5ケタの半角数字で後ろの3文字は空文字で埋まるようになっているので、"11111□□□"になるはずだと想定していました。
|
102
|
-
|
29
|
+
|
103
|
-
COPY実行後追加されたレコード確認したところ、"1
|
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/ツールのバージョンなど)
|