เจ้าหน้าที่ IT คนหนึ่งถามผมว่าจะแสดงข้อความใน pivot table ของ Excel ต้องทำอย่างไร
โดยเค้าเอาตัวอย่างมาให้ดูตามรูปด้านล่างนี้
ข้อมูลจริงจะมี label ประมาณหลักแสนและ header มีประมาณหลักพัน
และผลที่ต้องการอยากให้มันคล้ายๆกับด้านล่างนี้
แน่นอนครับว่าถามผมแบบนี้ผมก็บอกว่าไม่รู้ครับว่าทำยังไงใน Excel
แต่ถ้าทำใน Mathematica ล่ะง่ายนิดเดียวครับ 🙂
อันนี้เป็น Mathematica codes ที่ผมเขียนครับ
(* แสดงข้อมูลทั้งหมดของ id ที่ต้องการ *)
datid[id_, data_] := Module[{pos, headls}, headls = data[[1]];
pos = Union[Position[headls, “label”], Position[headls, “label”]] //
Flatten;
Select[data, #[[pos[[1]]]] == id &]];
(* แสดง list ของ header ของข้อมูล *)
headerls[dat_] := Module[{ls},
ls = Union@dat[[2 ;; Length@dat, 2]];
ls
];
(* เแสดงข้อมูลเป็นแถวๆของ id ที่ต้องการ *)
makerow[id_, dat_] := Module[{hdls, iddat, tmp, output, i, j},
hdls = headerls[dat];
iddat = datid[id, dat];
tmp = Table[0, {Length@hdls}];
For[i = 1, i <= Length@iddat, i++,
For[j = 1, j <= Length@hdls, j++,
If[iddat[[i, 2]] == hdls[[j]],
tmp = ReplacePart[tmp, j -> iddat[[i, 3]]]]]];
{id}~Join~tmp
];
(* function หลักสำหรับอ่านไฟล์ข้อมูล และแสดงผล*)
mtr[filename_] := Module[{dat, outls, hdrls, idls},
dat = Import[filename, {“Data”, 1}];
hdrls = headerls[dat];
idls = idlist[dat];
outls = makerow[#, dat] & /@ idls;
{{“label”}~Join~hdrls}~Join~outls
];
(* เขียนผลลัพท์เป็น Excel *)
Export[“outfile.xlsx”,mtr[“data.xlsx”],”XLSX”]