写个近况。
最近一个需要谕知全公司的人知道的东西,是好几个 EXCEL
档,每个档里头各有一些字段资料,大致上是 A<->B 间的
对照,而 A 有 A1, A2, ... 等字段,B 有 B1, B2, .. 等
字段。
这时,比方我想查的东西,刚好分散在好几个 EXCEL 档里头
,查起来很麻烦,用 javascript 会简单很多:
1.这些档都另存 .csv
2.写一支 htm 档,开头就去读取这些 .csv 的东西,存成一
个叫做 tmps 的字串阵列,每个元素都是每个 csv 档的每一
行:
var tmps=[];
var fso=new ActiveXObject("filesystemobject");
for(i=0;i<dirs.length;i++)
{
f=fso.OpenTextFile("D:\\"+i+".csv");
csv=f.ReadAll();
f.close();
tmps.push(csv.split("\n"));
}
这样 tmps 就是我要的全域变量
通常 tmps 还可以 tmps.sort(); 一下
3.宣告两个全域变量
var data1={};
var data2={};
data1 用来储存 A 资料的各字段,使用 mapping 的储存格
式,比方其资料结构如下
data1[A1][A2][A3]...
它的做法很单纯,就是去对每一个 tmps[i] 做必要的拆解:
for(i=0;i<tmps.length;i++)
{
ab=tmps[i].split("A资料与B资料间的分隔字串");
// 这样 ab[0] = A资料, ab[1] = B资料
// 先处理 data1
a=ab[0].split("\t");
if(typeof(data1[a[0]])=="undefined")
data1[a[0]]={};
if(typeof(data1[a[0]][a[1]])=="undefined")
data1[a[0]][a[1]]={};
.
.
// 再处理 data2
b=ab[1].split("\t");
if(typeof(data2[b[0]])=="undefined")
data2[b[0]]={};
if(typeof(data2[b[0]][b[1]])=="undefined")
data2[b[0]][b[1]]={};
.
.
}
4.有了 tmps 及 data1、data2,就可以很简单的做下拉式
查询接口,既可由 A 查 B,也可由 B 查 A。例如使用者
想由 A 查 B,它下拉了 A1、A2、A3 三项,然后按下查
询按纽,该按纽 on_click='search_a_b();'
function search_a_b()
{
s1=document.getElementById("s1").value;
s2=document.getElementById("s2").value;
s3=document.getElementById("s3").value;
// 当然实际不会这样写,这里只是简单说明
// 产生比对用字串
ss=s1+"\t"+s2+"\t"+s3;
// 然后去跟 tmps 里面的每一笔做比对
str="";
for(i=0;i<tmps.length;i++)
{
ab=tmps[i].split("A资料与B资料间的分隔字串");
// 因为是由 A 查 B 所以比对目标放在 ab[0];
if(ab[0].indexOf(ss)==-1) continue;
// 比对到符合的
str+=tmps[i].replace(/\t/g," ")+"<BR>";
}
document.write(str);
}
它会将所有符合该三项下拉选项的结果都列出来,比方 A 资料
其实有 A1~A5 五个可下拉项,使用者只下拉前三个时,它就把
只要符合前三项即可的都列出来。
例如说,以异特龙为例,牠所属的界、门、纲如下
界: 动物界
门: 脊索动物门
纲: 蜥形纲
牠所属的目、科、属如下
总目: 恐龙总目
目: 鸟臀目
科: 剑龙科
亚科: 剑龙亚科
属: 剑龙属
名字: 异特龙
那前面的界门纲就相当于 A 资料,目科属就相当于 B 资料。
那比方我要由 A 查 B,分别下拉动物界、脊索动物门、蜥形纲,
按下查询,那它就应该要显示的资料:
动物界 脊索动物门 蜥形纲 ←→ 恐龙总目 鸟臀目 剑龙科 剑龙亚科 剑龙属 异特龙
上面的 ss 变量就是 "动物界\t脊索动物门\t蜥形纲",它就会去
比对每一个 tmps[i] 里头的字串,有没有跟 ss match 的,有的
话,就把该行 document.write 出来。
则这时假设我只下拉前两个,它自然会把所有有符合前两个的都列
出,例如光脊索动物门就又有很多分支:
https://i.imgur.com/Zv0coMN.jpg
我写好这个东西后,把 htm 档丢到公司内网再告知同单位的同事
有这个东西,则只要知道这东西的人,就不用再去 EXCEL 一个一
个点开来看,只要透过该 htm 的查询接口,即可轻松查询出想知
道的结果,而且可透过这样的综览,明确知道公司想告诉我们的事
它日后的更新也很方便,每一次的更新就是夹带一些 EXCEL 档,
将它们指定目录另存 .csv,大概一两分钟吧就通通另存完毕,然
后 htm 查询接口就能查到最新的结果。
进一步来说,还可以写树状显示,这个利用 mapping 及 <table>
标签的容许弹性来做即可,以资料A 的树状结构为例:"
str="<table>";
a1=Object.keys(data1);
for(i1=0;i1<a1.length;i1++)
{
str+="<tr><td>"+a1[i1]+"</td></tr>";
a2=Object.keys(data1[a1[i1]]);
for(i2=0;i2<a2.length;i2++)
{
str+="<tr><td></td><td>"+a2[i2]+"</td></tr>";
a3=Object.keys(data1[a1[i1]][a2[i2]]);
for(i3=0;i3<a3.length;i3++)
{
str+="<tr><td></td><td></td><td>"+a3[i3]+"</td></tr>";
.
.
}
}
}
// 表格的好处就是每一行累加字串最后只要有 </tr> 就不会出错
str+="</table>";
document.write(str);
这样出来的资料就类似
xx1
xx11
xx111
xx112
.
.
xx12
xx121
xx122
xx1221
xx1222
.
.
xx123
.
.
.
.
xx2
xx21
xx211
.
.
即全部的资料依树状的方式显示于同一个 htm 页面,这时手动
按 ctrl-f 去看资料位在哪也是可以,进阶写法就透过展开按钮
对 style="display:none/block" 做切换,即可实现树状结构的
展开及缩回。
熟悉 mapping 的话,这些不用花多少时间就能写出来。
我的感触就是,要给全公司看的东西,原始资料不应该如此分散
,这次的经验可应用在很多地方。
我目前仅剩一件事情令我觉得心烦,这个月要面对,希望能顺利
,渡过了就没事了,应该会继续把 confarea.htm 完工。这东西
的缺点是无法写成线上网页,但如果放到 github 的话则大家都
可以下载,我蛮希望以后有人真的能下载然后利用它写圣殿的区
域。
其它没啥事,晚上预计做个备份。
LAechan