質問編集履歴

2

変数名と実行結果を修正しました

2024/05/30 03:09

投稿

takahiro0914
takahiro0914

スコア1

test CHANGED
File without changes
test CHANGED
@@ -5,25 +5,25 @@
5
5
  ```
6
6
 
7
7
  (並び替え前)
8
- [24-5A-3 0 P0-123450 ユニット部品 MA]
8
+ [24-5A-3 0 ABC-123450 ユニット部品 C0]
9
- [24-5A-3 0 P0-123450 ユニット部品 L]
10
- [24-5A-3 0 P0-123450 ユニット部品 ZI]
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 P0-123450 ユニット部品 ZW]
10
+ [24-5A-3 0 ABC-123450 ユニット部品 C3]
14
- [24-5A-3 0 P0-123450 ユニット部品 ZP]
11
+ [24-5A-3 0 ABC-123450 ユニット部品 C4]
15
- [24-5A-3 0 P0-123450 ユニット部品 ZZ]
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 99-10-001 ハウング CP]
16
+ [24-6C-9 1 XYZ-10-001 D0]
17
- [24-6C-9 1 99-10-001 ハウング ZI]
17
+ [24-6C-9 1 XYZ-10-001 D1]
18
- [24-6C-9 1 99-10-001 ハウング ZZ]
18
+ [24-6C-9 1 XYZ-10-001 D2]
19
- [24-6C-9 2 99-10-002 ピン K]
20
- [24-6C-9 2 99-10-002 ピン ZI]
19
+ [24-6C-9 2 XYZ-10-002 ボルト E0]
21
- [24-6C-9 2 99-10-002 ピン ZZ]
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 P0-123450 ユニット部品 MA,L,ZI,HQI,ZI2<ZW,ZP,ZZ]
24
+ [24-5A-3 0 ABC-123450 ユニット部品 C1,C2,C3,C4,C5,C6,C7,C8]
25
- [24-6C-9 1 99-10-001 ハウング CP,ZI,ZZ]
25
+ [24-6C-9 1 XYZ-10-001 D0,D1,D2]
26
- [24-6C-9 2 99-10-002 ピン K,ZI,ZZ]
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-30P0-123450:[[24-5A-3 0 P0-123450 ユニット部品 MA] [24-5A-3 0 P0-123450 ユニット部品 L] [24-5A-3 0 P0-123450 ユニット部品 ZI] [24-5A-3 0 P0-123450 ユニット部品 HQI] [24-5A-3 0 P0-123450 ユニット部品 ZI2] [24-5A-3 0 P0-123450 ユニット部品 ZW] [24-5A-3 0 P0-123450 ユニット部品 ZP] [24-5A-3 0 P0-123450 ユニット部品 ZZ]] 24-6C-9199-10-001:[[24-6C-9 1 99-10-001 ハウジング CP] [24-6C-9 1 99-10-001 ハウング ZI] [24-6C-9 1 99-10-001 ハウング ZZ]] 24-6C-9299-10-002:[[24-6C-9 2 99-10-002 ピン K] [24-6C-9 2 99-10-002 ピン ZI] [24-6C-9 2 99-10-002 ピン ZZ]]]
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 P0-123450 ユニット部品 MA] [24-5A-3 0 P0-123450 ユニット部品 L] [24-5A-3 0 P0-123450 ユニット部品 ZI] [24-5A-3 0 P0-123450 ユニット部品 HQI] [24-5A-3 0 P0-123450 ユニット部品 ZI2] [24-5A-3 0 P0-123450 ユニット部品 ZW] [24-5A-3 0 P0-123450 ユニット部品 ZP] [24-5A-3 0 P0-123450 ユニット部品 ZZ] [24-6C-9 1 99-10-001 ハウング CP] [24-6C-9 1 99-10-001 ハウング ZI] [24-6C-9 1 99-10-001 ハウング ZZ] [24-6C-9 2 99-10-002 ピン K] [24-6C-9 2 99-10-002 ピン ZI] [24-6C-9 2 99-10-002 ピン ZZ]]
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 P0-123450 ユニット部品 MA]
116
+ [24-5A-3 0 ABC-123450 ユニット部品 C0]
116
- [24-5A-3 0 P0-123450 ユニット部品 L]
117
- [24-5A-3 0 P0-123450 ユニット部品 ZI]
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 P0-123450 ユニット部品 ZW]
118
+ [24-5A-3 0 ABC-123450 ユニット部品 C3]
121
- [24-5A-3 0 P0-123450 ユニット部品 ZP]
119
+ [24-5A-3 0 ABC-123450 ユニット部品 C4]
122
- [24-5A-3 0 P0-123450 ユニット部品 ZZ]
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 99-10-001 ハウング CP]
124
+ [24-6C-9 1 XYZ-10-001 D0]
124
- [24-6C-9 1 99-10-001 ハウング ZI]
125
+ [24-6C-9 1 XYZ-10-001 D1]
125
- [24-6C-9 1 99-10-001 ハウング ZZ]
126
+ [24-6C-9 1 XYZ-10-001 D2]
126
- [24-6C-9 2 99-10-002 ピン K]
127
- [24-6C-9 2 99-10-002 ピン ZI]
127
+ [24-6C-9 2 XYZ-10-002 ボルト E0]
128
- [24-6C-9 2 99-10-002 ピン ZZ]
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 P0-123450 ユニット部品 MA,L,ZI,HQI,ZI2<ZW,ZP,ZZ]
132
+ [24-5A-3 0 ABC-123450 ユニット部品 C1,C2,C3,C4,C5,C6,C7,C8]
132
- [24-6C-9 1 99-10-001 ハウング CP,ZI,ZZ]
133
+ [24-6C-9 1 XYZ-10-001 D0,D1,D2]
133
- [24-6C-9 2 99-10-002 ピン K,ZI,ZZ]
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

コメントで頂いたコードをもとに本番データ用に置換えた結果を追記しました

2024/05/29 05:18

投稿

takahiro0914
takahiro0914

スコア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
+ ```