質問編集履歴
2
変数名と実行結果を修正しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,25 +5,25 @@
|
|
5
5
|
```
|
6
6
|
|
7
7
|
(並び替え前)
|
8
|
-
[24-5A-3 0
|
8
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C0]
|
9
|
-
[24-5A-3 0 P0-123450 ユニット部品 L]
|
10
|
-
[24-5A-3 0
|
9
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C1]
|
11
|
-
[24-5A-3 0 P0-123450 ユニット部品 HQI]
|
12
|
-
[24-5A-3 0 P0-123450 ユニット部品 ZI2]
|
13
|
-
[24-5A-3 0
|
10
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C3]
|
14
|
-
[24-5A-3 0
|
11
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C4]
|
15
|
-
[24-5A-3 0
|
12
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C5]
|
13
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C6]
|
14
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C7]
|
15
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C8]
|
16
|
-
[24-6C-9 1
|
16
|
+
[24-6C-9 1 XYZ-10-001 ネジ D0]
|
17
|
-
[24-6C-9 1
|
17
|
+
[24-6C-9 1 XYZ-10-001 ネジ D1]
|
18
|
-
[24-6C-9 1
|
18
|
+
[24-6C-9 1 XYZ-10-001 ネジ D2]
|
19
|
-
[24-6C-9 2 99-10-002 ピン K]
|
20
|
-
[24-6C-9 2
|
19
|
+
[24-6C-9 2 XYZ-10-002 ボルト E0]
|
21
|
-
[24-6C-9 2
|
20
|
+
[24-6C-9 2 XYZ-10-002 ボルト E1]
|
21
|
+
[24-6C-9 2 XYZ-10-002 ボルト E2]
|
22
22
|
|
23
23
|
(並び替え後)
|
24
|
-
[24-5A-3 0
|
24
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C1,C2,C3,C4,C5,C6,C7,C8]
|
25
|
-
[24-6C-9 1
|
25
|
+
[24-6C-9 1 XYZ-10-001 ネジ D0,D1,D2]
|
26
|
-
[24-6C-9 2
|
26
|
+
[24-6C-9 2 XYZ-10-002 ボルト E0,E1,E2]
|
27
27
|
|
28
28
|
### 前提
|
29
29
|
はじめてGO言語を使用しています。
|
@@ -94,7 +94,7 @@
|
|
94
94
|
fmt.Println(groupedRecords)
|
95
95
|
```
|
96
96
|
```実行結果
|
97
|
-
map[24-5A-30
|
97
|
+
map[24-5A-30ABC-123450:[[24-5A-3 0 ABC-123450 ユニット部品 C1] [24-5A-3 0 ABC-123450 ユニット部品 C2] [24-5A-3 0 ABC-123450 ユニット部品 C3] [24-5A-3 0 ABC-123450 ユニット部品 C4] [24-5A-3 0 ABC-123450 ユニット部品 C5] [24-5A-3 0 ABC-123450 ユニット部品 C6] [24-5A-3 0 ABC-123450 ユニット部品 C7] [24-5A-3 0 ABC-123450 ユニット部品 C8]] 24-6C-91XYZ-10-001:[[24-6C-9 1 XYZ-10-001 ハウジング D0] [24-6C-9 1 XYZ-10-001 ネジ D1] [24-6C-9 1 XYZ-10-001 ネジ D2]] 24-6C-92XYZ-10-002:[[24-6C-9 2 XYZ-10-002 ボルト E0] [24-6C-9 2 XYZ-10-002 ボルト E1] [24-6C-9 2 XYZ-10-002 ボルト E2]]]
|
98
98
|
```
|
99
99
|
|
100
100
|
0. 配列recordsをSQL言語でいう"SELECT `pnum_`,`bnum_`,`dnum_`,`pname`,group_concat(`pcode` separator ',') FROM `records` GROUP BY `_ddt_`,`pnum_`,`inum_`,`bnum_` ORDER BY `cnum_`,`_ddt_`,`pnum_`,`bnum_`,`inum_`;"をGO言語で並び替えするには?
|
@@ -107,30 +107,32 @@
|
|
107
107
|
fmt.Println(groupedRecords)
|
108
108
|
```
|
109
109
|
```実行結果
|
110
|
-
[[24-5A-3 0
|
110
|
+
[[24-5A-3 0 ABC-123450 ユニット部品 C1] [24-5A-3 0 ABC-123450 ユニット部品 C2] [24-5A-3 0 ABC-123450 ユニット部品 C3] [24-5A-3 0 ABC-123450 ユニット部品 C4] [24-5A-3 0 ABC-123450 ユニット部品 C5] [24-5A-3 0 ABC-123450 ユニット部品 C6] [24-5A-3 0 ABC-123450 ユニット部品 C7] [24-5A-3 0 ABC-123450 ユニット部品 C8] [24-6C-9 1 XYZ-10-001 ネジ D0] [24-6C-9 1 XYZ-10-001 ネジ D1] [24-6C-9 1 XYZ-10-001 ネジ D2] [24-6C-9 2 XYZ-10-002 ボルト E0] [24-6C-9 2 XYZ-10-002 ボルト E1] [24-6C-9 2 XYZ-10-002 ボルト E2]]
|
111
111
|
```
|
112
112
|
0. recordsを次の例のように並び替えを行うにあはどうすればいい?
|
113
113
|
|
114
|
+
|
114
115
|
(並び替え前)
|
115
|
-
[24-5A-3 0
|
116
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C0]
|
116
|
-
[24-5A-3 0 P0-123450 ユニット部品 L]
|
117
|
-
[24-5A-3 0
|
117
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C1]
|
118
|
-
[24-5A-3 0 P0-123450 ユニット部品 HQI]
|
119
|
-
[24-5A-3 0 P0-123450 ユニット部品 ZI2]
|
120
|
-
[24-5A-3 0
|
118
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C3]
|
121
|
-
[24-5A-3 0
|
119
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C4]
|
122
|
-
[24-5A-3 0
|
120
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C5]
|
121
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C6]
|
122
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C7]
|
123
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C8]
|
123
|
-
[24-6C-9 1
|
124
|
+
[24-6C-9 1 XYZ-10-001 ネジ D0]
|
124
|
-
[24-6C-9 1
|
125
|
+
[24-6C-9 1 XYZ-10-001 ネジ D1]
|
125
|
-
[24-6C-9 1
|
126
|
+
[24-6C-9 1 XYZ-10-001 ネジ D2]
|
126
|
-
[24-6C-9 2 99-10-002 ピン K]
|
127
|
-
[24-6C-9 2
|
127
|
+
[24-6C-9 2 XYZ-10-002 ボルト E0]
|
128
|
-
[24-6C-9 2
|
128
|
+
[24-6C-9 2 XYZ-10-002 ボルト E1]
|
129
|
+
[24-6C-9 2 XYZ-10-002 ボルト E2]
|
129
130
|
|
130
131
|
(並び替え後)
|
131
|
-
[24-5A-3 0
|
132
|
+
[24-5A-3 0 ABC-123450 ユニット部品 C1,C2,C3,C4,C5,C6,C7,C8]
|
132
|
-
[24-6C-9 1
|
133
|
+
[24-6C-9 1 XYZ-10-001 ネジ D0,D1,D2]
|
133
|
-
[24-6C-9 2
|
134
|
+
[24-6C-9 2 XYZ-10-002 ボルト E0,E1,E2]
|
135
|
+
|
134
136
|
```回答コード
|
135
137
|
// recordsを指定の条件で並べ替え、指定のカラムをGROUP_CONCATで結合する
|
136
138
|
sort.Slice(records, func(i, j int) bool {
|
@@ -161,8 +163,8 @@
|
|
161
163
|
```
|
162
164
|
```実行結果
|
163
165
|
ユニット部品,ユニット部品,ユニット部品,ユニット部品,ユニット部品,ユニット部品,ユニット部品,ユニット部品
|
164
|
-
ハウジング,ハウジング,ハウジング
|
165
|
-
|
166
|
+
ネジ,ネジ,ネジ
|
167
|
+
ボルト,ボルト,ボルト
|
166
168
|
```
|
167
169
|
|
168
170
|
0. (補足追記)
|
1
コメントで頂いたコードをもとに本番データ用に置換えた結果を追記しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -81,7 +81,6 @@
|
|
81
81
|
fmt.Println(record)
|
82
82
|
}
|
83
83
|
```
|
84
|
-
|
85
84
|
### 試したこと
|
86
85
|
ChatGPTに質問しながら実行したソースコードと実行結果は次の通りです。
|
87
86
|
|
@@ -165,3 +164,93 @@
|
|
165
164
|
ハウジング,ハウジング,ハウジング
|
166
165
|
ピン,ピン,ピン
|
167
166
|
```
|
167
|
+
|
168
|
+
0. (補足追記)
|
169
|
+
melianさんから教えていただきましたコードを実行したところ、実装できました。
|
170
|
+
ただし、コメントにて追記した通り、今回質問するにあたり、データ配列を簡略化してお知らせしてしまったため、本番のプログラム用に書き換えたのですがうまく動作しませんでした。
|
171
|
+
```実行コード
|
172
|
+
package main
|
173
|
+
|
174
|
+
import (
|
175
|
+
"bufio"
|
176
|
+
"cmp"
|
177
|
+
"encoding/csv"
|
178
|
+
"fmt"
|
179
|
+
"log"
|
180
|
+
"os"
|
181
|
+
"slices"
|
182
|
+
|
183
|
+
"golang.org/x/exp/maps"
|
184
|
+
"golang.org/x/text/encoding/unicode"
|
185
|
+
"golang.org/x/text/transform"
|
186
|
+
)
|
187
|
+
|
188
|
+
type mapKey struct {
|
189
|
+
sName, cNum, cName, pNum, iNum, bNum, dNum, pName, pq, ddt, adt, wdt, upric, tpric, palgn, pcode string
|
190
|
+
}
|
191
|
+
|
192
|
+
func main() {
|
193
|
+
//*CSVを開く
|
194
|
+
csvFile, err := os.Open("/Users/onodzukatakahiro/GoApps/GoPlanner/assets/plan.csv")
|
195
|
+
if err != nil {
|
196
|
+
log.Fatal(err)
|
197
|
+
}
|
198
|
+
defer csvFile.Close()
|
199
|
+
|
200
|
+
//*UTF-16LEエンコーディングをUTF-8に変換
|
201
|
+
utf16bom := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM)
|
202
|
+
reader := csv.NewReader(transform.NewReader(bufio.NewReader(csvFile), utf16bom.NewDecoder()))
|
203
|
+
reader.FieldsPerRecord = -1 //para:可変フィールド数を許容する設定
|
204
|
+
reader.LazyQuotes = true //para:不正引用符の許容
|
205
|
+
|
206
|
+
//*csvデータを読み込む
|
207
|
+
records, err := reader.ReadAll()
|
208
|
+
if err != nil {
|
209
|
+
log.Fatalf("CSVファイル読み込みエラー: %v", err)
|
210
|
+
}
|
211
|
+
|
212
|
+
//*csvデータをチェックして表示する
|
213
|
+
for i, record := range records {
|
214
|
+
if len(record) != len(records[0]) {
|
215
|
+
log.Printf("警告: 行 %d はフィールド数が異なります。", i+1)
|
216
|
+
}
|
217
|
+
|
218
|
+
// デバッグ用:全レコードの表示
|
219
|
+
// fmt.Println(record)
|
220
|
+
}
|
221
|
+
|
222
|
+
// SQL文のようなgroupbyとgroup_concatを実現する
|
223
|
+
groupedMap := make(map[mapKey]string)
|
224
|
+
for _, record := range records {
|
225
|
+
key := mapKey{record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7], record[8], record[9], record[10], record[11], record[12], record[13], record[14], record[15]}
|
226
|
+
|
227
|
+
groupedMap[key] = ""
|
228
|
+
if _, ok := groupedMap[key]; ok {
|
229
|
+
groupedMap[key] += "," + record[16]
|
230
|
+
}
|
231
|
+
|
232
|
+
}
|
233
|
+
|
234
|
+
// グループキーの並べ替え
|
235
|
+
keys := maps.Keys(groupedMap)
|
236
|
+
slices.SortFunc(keys, func(a, b mapKey) int {
|
237
|
+
return cmp.Or(
|
238
|
+
cmp.Compare(a.pNum, b.pNum), cmp.Compare(a.bNum, b.bNum),
|
239
|
+
cmp.Compare(a.dNum, b.dNum), cmp.Compare(a.pName, b.pName),
|
240
|
+
)
|
241
|
+
})
|
242
|
+
|
243
|
+
// MAPをスライスする
|
244
|
+
groupedRecords := make([][]string, 0, len(keys))
|
245
|
+
for _, k := range keys {
|
246
|
+
groupedRecords = append(
|
247
|
+
groupedRecords, []string{k.sName, k.cNum, k.cName, k.pNum, k.iNum, k.bNum, k.dNum, k.pName, k.pq, k.ddt, k.adt, k.wdt, k.upric, k.tpric, k.palgn, groupedMap[k]})
|
248
|
+
|
249
|
+
}
|
250
|
+
|
251
|
+
fmt.Println(groupedRecords)
|
252
|
+
}
|
253
|
+
```
|
254
|
+
```実行結果
|
255
|
+
[]
|
256
|
+
```
|