三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.10 〜 No.14


No.10 2002/12/07
テキストファイルからデータを読む
[ページTOPへ戻る]
<テキストファイルからデータを読む>

こんにちは、Ken3です。

今回は、
テキスト、ファイルからの読み込みをやってみたいと思います。
あまり期待しないでね。

/*
 * 1.書き込みが出来たら、読み込み処理でしょ
*/
書き込みが出来たら、読み込み処理でしょ、
って、安易な流れで、今日は、読み込み処理をやってみます。

test008.txt ( http://www.ken3.org/cgi-bin/test/test008.txt )
に時刻と評価が下記のように書かれています。
2002/12/05 8:11:04 , 満足
2002/12/05 8:14:12 , 普通
2002/12/05 15:53:28 , 満足
 ・
 ・
 ・
2002/12/07 15:36:54 , 満足
2002/12/07 15:56:49 , 満足
2002/12/07 15:57:22 , 不正なパラメーターです

このデータを読み込んで、画面に表示したいと思います。

ほんと、安易ですね、芸が無いよね?面白くない、読者さん達も同じ意見でしょ?

まぁ、まぁ、
初めは簡単にね。
なんてキレの無いいつもの前置きは置いといて。続きをどうぞ。

/*
 * 2.一行読み込み .ReadLine
*/

いつものサンプル先出しから行きます。
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>.ReadLine テキストファイルから1行データを読み込む</title>
</head>
<body>
<h2>.ReadLine テキストファイルから1行データを読み込む</h2>
test010-1.asp<br>
<hr>

<%
'*1 FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'*2 test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

'*3ファイルからデータを一行を読む
strDATA = ts.ReadLine 

'*4使ったファイルは閉じようよ
ts.close

'*5読み込んだデータを表示します(strDATA)
Response.Write strDATA

%>
<hr>
終了です<br>
<A HREF="test008.txt">元データtest008.txtを見る</A><br>
</body>
</html>
---

ポイントは、
'*2 test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)
↑ここで、読み取りモードの1でテキストファイルを開きます

次に、
'*3ファイルからデータを一行を読む
strDATA = ts.ReadLine 
の.ReadLineでデータを一行読み込み、
変数strDATAに代入してます。

その変数を単純に、Response.Writeで表示しただけです。

http://www.ken3.org/cgi-bin/test/test010-1.asp
のサンプルを実行すると、
一行目の
2002/12/05 8:11:04 , 満足 
が無事に表示されます。



へぇ〜、だから何?
そんな一行読んでも、ツマラナイし、使えないジャン。

そうですよね。
で、次に出てくるのが、
ファイルの最後までデータを表示ですよね。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/*
 * 3..AtEndOfStream でファイルの終端をチェックする
*/

先頭行の読み込みは、無事に出来ました。
今度は、ファイルの最後までデータを読みたいので、
ループを使って、ファイルを最後まで読んでみたいと思います。

さて、ファイルが最後か?判断は?どうしましょうかねぇ。。
人間はスゴイね、目で上から読んで行って、最後がわかるんだもん。
まぁ、そんなくだらないこと言ってないで、

.AtEndOfStream
ってのがあって、
ファイルの終わりに達すると、Trueになる(Trueを返す)
逆に、ファイルの終わりじゃ無い時は、
Falseなので、
次のようなループを作ってみました。
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>.AtEndOfStream でファイルの終端をチェックする</title>
</head>
<body>
<h2>.AtEndOfStream でファイルの終端をチェックする</h2>
test010-2.asp<br>
<hr>

<%
' FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

' test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    Response.Write strDATA  '読み込んだデータを表示
    Response.Write "<BR>"   '改行のタグを入れる
Loop

ts.close  '使ったファイルは閉じようよ

%>
<hr>
終了です<br>
<A HREF="test008.txt">元データtest008.txtを見る</A><br>
</body>
</html>
---

http://www.ken3.org/cgi-bin/test/test010-2.asp
でサンプル実行可能です。

ポイントのループの作りは、
Do While ts.AtEndOfStream = False  '*6ファイルの終端になってない間ループ
で、
ts.AtEndOfStream が False の間、ループを実行します。

    strDATA = ts.ReadLine   'ファイルからデータを一行を読む
    Response.Write strDATA  '読み込んだデータを表示
上2行で、読み込み、表示をやってます。
もちろん、Response.Write ts.ReadLine と変数経由じゃなくてもOKです。

    Response.Write "<BR>"   '改行のタグを入れる
これが無いと(笑)、改行されてデータが表示されません(初めしくじりました私)

Loop  
↑ループの先頭に戻ります。

/*
 * 4..ReadAll で ファイルを全て読む
*/

あと、読み込みのメソッドで、
.ReadAll
ってのがあって、
ファイルを一度に全て読む
そんなこともできます。

お約束の注意事項では、
メモリを一度に消費するので、
大きなファイルを読み込むのはやめましょうかな。

三流君の前置きはいいから、使い方は?簡単なのかよ?
そっちのほうが知りたいよ。

では、下記サンプルです。
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>.ReadAll で ファイルを全て読む</title>
</head>
<body>
<h2>.ReadAll で ファイルを全て読む</h2>
test010-3.asp<br>
<hr>

<%
' FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

' test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

strDATA = ts.ReadAll '*7 .ReadAllでファイルを全て変数へ

Response.Write "<PRE>"   '<PRE>のタグでそのまま表示する
Response.Write strDATA   '読み込んだ全てのデータを表示
Response.Write "</PRE>"  '<PRE>タグ終了

ts.close  '使ったファイルは閉じようよ

%>
<hr>
終了です<br>
<A HREF="test008.txt">元データtest008.txtを見る</A><br>
</body>
</html>
---

http://www.ken3.org/cgi-bin/test/test010-3.asp
でサンプル実行可能です。

使い方は、簡単で、
strDATA = ts.ReadAll '*7 .ReadAllでファイルを全て変数へ
みたいにすると、ファイルのデータを全て読み込んで変数に代入されます。

短いファイルの時は、使ってみると、少し楽できるかもしれません。

/*
 * 5.終わりの挨拶
*/

今回は、ファイルからの読み込み処理で、
.ReadLine       一行読み込み
.AtEndOfStream  ファイルの終端チェック
.ReadAll        一度に全データを読み込む
を使用してみました。

まぁなんとなく、わかったような、わからなかったような。
まだまだ、道のりは遠いなぁ〜

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.11 2002/12/08
結果のデータをInStr関数を使ってカウントしてみる
[ページTOPへ戻る]
<結果のデータをInStr関数を使ってカウントしてみる>


こんにちは、Ken3です。

前回、テキストファイルからの読み込み処理を行ったので、
今回は、
ファイルデータを読み込み、カウントしたいと思います。
あまり期待しないでね。

/*
 * 1.集計元のデータ説明
*/

テストデータは、おなじみの?下記のデータを使用します。

test008.txt ( http://www.ken3.org/cgi-bin/test/test008.txt )
に時刻と評価が下記のように書かれています。
2002/12/05 8:11:04 , 満足
2002/12/05 8:14:12 , 普通
2002/12/05 15:53:28 , 満足
 ・
 ・
 ・
2002/12/07 15:36:54 , 満足
2002/12/07 15:56:49 , 満足
2002/12/07 15:57:22 , 不正なパラメーターです

このデータを読み込んで、
満足、普通、不満、を集計(カウント)したいと思います。

今回も、芸が無いなぁ、、、、

/*
 * 2.一行読み込み後、InStr関数を使ってカウントしてみる。
*/

前回の.ReadLineを参考に読み込み部のループを作成し、

下記のように集計してみました。
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>一行読み込み後、InStr関数を使ってカウントしてみる</title>
</head>
<body>
<h2>一行読み込み後、InStr関数を使ってカウントしてみる</h2>
test011-1.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT01     '満足 カウンター
dim nCNT02     '普通 カウンター
dim nCNT03     '不満 カウンター

nCNT01 = 0 '*1 カウンターを初期化しておく
nCNT02 = 0
nCNT03 = 0

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test008.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test008.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*2 InStr関数を使って文字列を探す、見つかったらカウントアップ
    If InStr(strRECORD, "満足") > 0 Then nCNT01 = nCNT01 + 1
    If InStr(strRECORD, "普通") > 0 Then nCNT02 = nCNT02 + 1
    If InStr(strRECORD, "不満") > 0 Then nCNT03 = nCNT03 + 1
Loop

ts.close  '使ったファイルは閉じようよ

'*3結果の表示
Response.Write "満足は、" & nCNT01 & "人<BR>"
Response.Write "普通は、" & nCNT02 & "人<BR>"
Response.Write "不満は、" & nCNT03 & "人<BR>"

%>
<hr>
終了です<br>
<A HREF="test008.txt" target="_new">元データtest008.txtを見る</A><br>
</body>
</html>
---

http://www.ken3.org/cgi-bin/test/test011-1.asp
でサンプル実行可能です。

ポイントは、
nCNT01 = 0 '*1 カウンターを初期化しておく
nCNT02 = 0
nCNT03 = 0
で、初めにカウンター変数を初期化しておきます。

次が今回の講座の内容なんだけど、
    '*2 InStr関数を使って文字列を探す、見つかったらカウントアップ
    If InStr(strRECORD, "満足") > 0 Then nCNT01 = nCNT01 + 1
    If InStr(strRECORD, "普通") > 0 Then nCNT02 = nCNT02 + 1
    If InStr(strRECORD, "不満") > 0 Then nCNT03 = nCNT03 + 1
これは、
InStr関数が、文字列を継がす関数で、
InStr(元の文字列, 検索文字列)
機能は、見つかった場所(n文字目)を結果で返します。
また、見つからなかった時は0を返してくれます。
で、If文と組み合わせて、
If InStr(strRECORD, "満足") > 0 Then nCNT01 = nCNT01 + 1
と0以上の時は見つかったと判断、カウントアップしてます。

最後に結果を
'*3結果の表示
Response.Write "満足は、" & nCNT01 & "人<BR>"
Response.Write "普通は、" & nCNT02 & "人<BR>"
Response.Write "不満は、" & nCNT03 & "人<BR>"
で、単純に表示してます。

/*
 * 3.終わりの挨拶
*/

今回は、文字列を探す関数
InStrを使って、
アンケート結果を集計してみました。

なんか、キレが無かったなぁ、、、サンプルも1つだったしね。
まだまだ、道のりは遠いなぁ〜

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.12 2002/12/09
Left関数を使ってみた、ファイル設計?
[ページTOPへ戻る]
<Left関数を使ってみた、ファイル設計?>

こんにちは、Ken3です。

前回は、
InStr関数を使用して、
テキストファイルからの読み込み、集計処理処理を行いました。
今回は、
シンプルに、普通のファイル設計
と
Left関数です。

あまり期待しないでね。

/*
 * 1.前回の集計元のデータ説明
*/

前置きが長くなるけどご勘弁を。

前回のテストデータは、おなじみの?下記のデータを使用してます。

test008.txt ( http://www.ken3.org/cgi-bin/test/test008.txt )
に時刻と評価が下記のように書かれています。
2002/12/05 8:11:04 , 満足
2002/12/05 8:14:12 , 普通
2002/12/05 15:53:28 , 満足
 ・
 ・
 ・
2002/12/07 15:36:54 , 満足
2002/12/07 15:56:49 , 満足
2002/12/07 15:57:22 , 不正なパラメーターです

このデータを読み込んで、
満足、普通、不満、を集計(カウント)してました。

ふつう?こんなファイルの作りしないよね?三流君変わってるよ。

えっ、なんで?
この時間に書きこまれた結果はXXですよ
って、みたままで、わかり易いと思うけどなぁ。
ねっ、皆さんも同じでしょ?

でも、書き込み時刻の後に、結果が文字列で入っているので、
InStr関数を使用して、
苦労して、満足、普通、不満の文字を探してやってますよね?

別に?苦労なんかしてないよ。
働いてるのはコンピュータだし、なんてバカなこと言ってないで、
今度はもっと簡単なファイルの作りに変えますか。

/*
 * 2.ファイルの仕様を考える
*/

ファイルの仕様を考える前に、何をしたいか?だよね初めは。

じゃ、五段階のアンケートを取ってよ、あっ、時刻も付けて。
5、満足
4、まぁまぁ
3、どちらとも言えない
2、少し不満
1、不満
の五段階にして下さい。確認のため日本語でも書き込んでよ。

では、ファイルフォーマットは今度も可変のカンマ区切りで
評価(1〜5),満足など日本語,書き込み時刻
にしましょう。

ファイル名はtest012.txtで下記のようなイメージで中身を保存。
1,不満,2002/12/07 15:36:54
5,満足,2002/12/07 15:56:49
2,少し不満,2002/12/07 15:57:22

日本語入れると、時刻がガタガタになるから気に入らないけど、
まぁ、イッカ。

/*
 * 3.次は入力、アンケート収集方法
*/

で、入力は?フォームからの入力、アンケートメールから?坊やの好みは?

できたら、どっちもやりたいなぁ。

ちっ、欲張りだなぁ。(おいおい、客に向かって舌打はないだろ、、、)

気を取り直して、まずは、HTML側からいくか、
5〜1の評価の選択だからラジオボタンを使うか。
HTML内に下記のフォームを貼ってね。

例)ラジオボタンでデータ選択、GETで送信(URLにパラを載せて送る)

<html>
<head>
<title>tset012.html 満足度を入力</title>
</head>
<body>
<h2>tset012.html 満足度を入力</h2>
<br>

<FORM ACTION="test012-1.asp" METHOD="GET">
このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
<br>
<INPUT TYPE="submit" VALUE="送 信">
<INPUT TYPE="reset"  VALUE="入力クリア">
</FORM>

</body>
</html>

簡単に書きましたが、ポイントは、
INPUT TYPE="RADIO" NAME="a" VALUE="1"
で、選択式のラジオボタンで、
データ量も少ないので、
METHOD="GET"
でtest012-1.aspを呼び出してます(送ってます)。

メールのほうは、クエリ情報で送るので、
アンケート取るには、
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=1  1、不満
でクリックしてもらってよ。

/*
 * 4.テキストファイルへの書き込み処理
*/

データがクエリ情報で送られてくるのかぁ、
項目名はaで内容は1から5だね。

1〜5以外の時はエラーにして、何もしないことにしよう(不正データは書かない)

下記のように作成しました。
(新しいことはやってないので復習的にコピーで作成)
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>テキストファイルに5〜1のアンケート結果を書き込む</title>
</head>
<body>
<h2>テキストファイルに5〜1のアンケート結果を書き込む</h2>
test012-1.asp<br>
<hr>
<%
    'アンケートの結果をまず判断する
strMSG = "不正なパラメーターです"  'エラーメッセージを初期値として代入
if Request.QueryString("a") = "5" then strMSG = "満足" 
if Request.QueryString("a") = "4" then strMSG = "まぁまぁ" 
if Request.QueryString("a") = "3" then strMSG = "どちらとも言えない" 
if Request.QueryString("a") = "2" then strMSG = "少し不満" 
if Request.QueryString("a") = "1" then strMSG = "不満" 

If strMSG = "不正なパラメーターです" Then 'エラーパラメータのままか?チェック
    Response.Write "データを正しく受け取れませんでした<br>"
Else
    'FileSystemObjectを生成します。
    Set objFS = Server.CreateObject("Scripting.FileSystemObject")

    'test012.txt を追加モードで開く
    Set ts = objFS.OpenTextFile(Server.MapPath("test012.txt"), 8, True)

    'ファイルにアンケート結果のデータを書き込む
    ts.write Request.QueryString("a") & ","   '結果1〜5を書く
    ts.write strMSG & ","    'ファイルに結果を書き込む
    ts.write Now             '時刻を書く

    ts.write chr(13) & chr(10)  '改行する

    '*4使ったファイルは閉じようよ
    ts.close
End if

Response.Write "パラメーターは<b>" & strMSG & "</b>"  '表示もついでに行う

%>
<hr>
回答、<b>ありがとうございます</b><br>
<A HREF="test012.txt" target="_new">結果の生データ、test012.txtを見る</A><br>

</body>
</html>
---

テストは、
http://www.ken3.org/cgi-bin/test/test012.html
でフォームからの入力、
メールからの直接入力は(URLリンク)
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=1  1、不満
で
データが渡ります。

下記のようなデータ形式でtest012.txtに書き込まれます。
3,どちらとも言えない,2002/12/09 19:04:33
5,満足,2002/12/09 19:04:54
2,少し不満,2002/12/09 19:06:52

う〜ん、ガタガタで見にくいけど、まぁ仕様通りには書きこめたカナ。

安心してないで、次、次。

/*
 * 5.読みこんだデータを<b> Left関数で判断 </b>
*/

ですねよね、データが書けたので、安心してないで、
読み込み、カウント処理を作成します。

今日、書きたかった Left 関数、やっとここで登場です。
---
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>一行読み込み後、Left関数を使ってカウントしてみる</title>
</head>
<body>
<h2>一行読み込み後、Left関数を使ってカウントしてみる</h2>
test012-1.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT05     '満足 カウンター
dim nCNT04     'まぁまぁ カウンター
dim nCNT03     'どちらとも言えない カウンター
dim nCNT02     '少し不満 カウンター
dim nCNT01     '不満 カウンター

nCNT01 = 0 '*1 カウンターを初期化しておく
nCNT02 = 0
nCNT03 = 0
nCNT04 = 0
nCNT05 = 0

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test012.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test012.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*2 Left関数を使って左から1文字目を判断、見つかったらカウントアップ
    Select Case Left(strRECORD, 1)  '読みこんだレコードの1文字目
        Case "5": nCNT05 = nCNT05 + 1
        Case "4": nCNT04 = nCNT04 + 1
        Case "3": nCNT03 = nCNT03 + 1
        Case "2": nCNT02 = nCNT02 + 1
        Case "1": nCNT01 = nCNT01 + 1
    End Select
Loop

ts.close  '使ったファイルは閉じようよ

'*3結果の表示
Response.Write "5、満足は、" & nCNT05 & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT04 & "人<BR>"
Response.Write "3、どちらとも言えないは、" & nCNT03 & "人<BR>"
Response.Write "2、少し不満は、" & nCNT02 & "人<BR>"
Response.Write "1、不満は、" & nCNT01 & "人<BR>"
%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test012.txt" target="_new">元データtest012.txtを見る</A><br>
</body>
</html>
---
三流君らしく、なんか、ダラダラと長いよね?
で、ポイントは何なの?

得に無いんだけど、
Left関数の使い方は、
Left(strRECORD, 1)みたいに、
Left(文字列,文字数)
で
左から文字数分の文字列を返します。
これを
Select Case文で判断してカウントしてます。

なんかプログラムにムダが多いんだけどなぁ。

http://www.ken3.org/cgi-bin/test/test012-2.asp
で、集計プログラムが動作します。

http://www.ken3.org/cgi-bin/test/test012.html
でフォームからの入力、

http://www.ken3.org/cgi-bin/test/test012.txt
で生データの確認ができます。

/*
 * 6.終わりの挨拶
*/

今回は、
シンプルなファイルの仕様を考えたのと
Left関数を使って、
アンケート結果を集計してみました。

システムって、
書き込み処理側、
読み込み処理側
あるので、
ファイル処理は、ファイルフォーマット作りで、
あるていど決まるのかなぁと思う今日この頃。

でも、まだまだ、イマイチなんだよね。
いろいろとある改善点は次回に。
道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。

No.13 2002/12/10
変数を配列にして簡潔に書いてみた
[ページTOPへ戻る]
<変数を配列にして簡潔に書いてみた>

こんにちは、Ken3です。

前回は、
No.12 Left関数を使ってみた、ファイル設計?
で、
ファイルフォーマットを変更して、
少しはわかりやすくプログラムを組んだつもりです。
が、
今回も、もう一人の心の中のKen3が納得してないので、
配列変数を使った集計プログラムに変更してみます。
(実はVBA系のメルマガ( http://www.ken3.org/vba/ )、で2次元配列書いてて、
 ASP側もやらないとマズイとフト思っただけなんだけなんだけど)

あまり期待しないでね。

/*
 * 1.前回の復習 
*/

いつものように前置きが長くなるけどご勘弁を。

目的は、
5段階の評価を収集・集計するアンケートを作成する。
5、満足
4、まぁまぁ
3、どちらとも言えない
2、少し不満
1、不満

アンケートの書き込み方法は(データの入り口は)、
2種類あって、

http://www.ken3.org/cgi-bin/test/test012.html
でフォームからの入力、
メールからの直接入力は(URLリンク)
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=1  1、不満
で
test012-1.aspにデータを渡し、test012.txt に書き込みます。

データは、
test012.txt ( http://www.ken3.org/cgi-bin/test/test012.txt )
に評価と時刻を下記のように書込みました。
2,少し不満,2002/12/09 20:15:52
5,満足,2002/12/09 20:16:09
4,まぁまぁ,2002/12/09 20:16:12
 ・
 ・
 ・
1,不満,2002/12/10 10:42:45
2,少し不満,2002/12/10 12:32:17
3,どちらとも言えない,2002/12/10 14:15:42

このデータを読み込んで、
http://www.ken3.org/cgi-bin/test/test012-2.asp
で、集計(結果表示)します。

/*
 * 2.修正が入りました。
*/

まぁ、それなりに動作していて、テストで押してくれる人も居て、
メルマガ読んでくれてるんだなぁ
と
ほっと一安心です。
下記の結果には少し残念だったけど
-- http://www.ken3.org/cgi-bin/test/test012-2.asp  12月10日時の集計値は
5、満足は、4人
4、まぁまぁは、1人
3、どちらとも言えないは、3人
2、少し不満は、6人
1、不満は、4人
-- でした。
不満が多いなぁ
って、そんなくだらない話を三流君がしてるからでしょ。
そんな5段階の評価ぐらいで落ち込むなって。

ヨシ、元気出すためにオレが考えた下記の2項目追加してよ。
6、大変満足、知人に教える
0、かなり不満、解除します
上記2点を追加して、5段階から7段階に変更してよ。
ねっ、6の大変満足が集計されると元気出るでしょ。

おいおい、じゃなんで、0のかなり不満解除が入ってんだよ。

3が中心だから、バランス取らなきゃ(笑)

なんて流れで、7段階評価への修正が入ってしまった。

/*
 * 3.アナタならどうする? 力技の単純修正
*/
さて、test012を修正するか。
今日は流れの変更無くて簡単だから、
Ken3お気に入りの一番弟子の
カッぺ君にやってもらうか、
カッペ君の特技は、カットandペーストで、大量の修正も苦にしないしね。

基本的にはアンケート項目増やすから、
変数追加すればOKだよ。
じゃ、カッペ君ヨロシクね。危なくなったら手伝うよ。

新キャラとして生き残れるか(笑)
のカットandペースト大好きのカッペ君の修正が始まった。

ア.HTMLフォームの修正

まずは、
test012.htmlをtest013.htmlにコピーする。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
オレ様の方法は、
エクスプローラーでtest012.htmlクリック後、
Ctrl+C(コピー)、すぐにCtrl+V(貼り付け)ってやると、
コピー 〜 test012.htmlってファイル名が下のほうに作成されるので、
その名前をF2を押してtest013.htmlに変更するね。
おっと、慣れない素人さんは、右クリック使うか、
新規ファイル作成後コピーでもいいよ。

Ken3)そんなのどうでもいいからハヤクやれ。

-- test012をコピーした初期状態 --
<html>
<head>
<title>tset012.html 満足度を入力</title>
</head>
<body>
<h2>tset012.html 満足度を入力</h2>
<br>

<FORM ACTION="test012-1.asp" METHOD="GET">
このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
<br>
<INPUT TYPE="submit" VALUE="送 信">
<INPUT TYPE="reset"  VALUE="入力クリア">
</FORM>
<br>
</body>
</html>
---

012の場所を013に変更、簡単だよね。
と
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

問題無いよね。
-- http://www.ken3.org/cgi-bin/test/test013.html --
<html>
<head>
<title>tset013.html 満足度を入力</title>
</head>
<body>
<h2>tset013.html 満足度を入力</h2>
<br>

<FORM ACTION="test013-1.asp" METHOD="GET">
このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="6">6.大変満足、知人に教えます<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="0">0.かなり不満、解除します<br>
<br>
<INPUT TYPE="submit" VALUE="送 信">
<INPUT TYPE="reset"  VALUE="入力クリア">
</FORM>
<br>
</body>
</html>
-- 
オレって、キー操作速いしね。

Ken3)あまりプログラムにキー打ちの速さは関係無いけどね

イ.書き込み部、test012-1.aspを修正してtest013-1.aspを作成

同様にまず、コピーして、test013-1.aspを作成するよ。
同じように、012を013へ、
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

-- 修正した test013-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>テキストファイルに6〜0のアンケート結果を書き込む</title>
</head>
<body>
<h2>テキストファイルに6〜0のアンケート結果を書き込む</h2>
test013-1.asp<br>
<hr>
<%
    'アンケートの結果をまず判断する
strMSG = "不正なパラメーターです"  'エラーメッセージを初期値として代入
if Request.QueryString("a") = "6" then strMSG = "大変満足"    'asp013追加
if Request.QueryString("a") = "5" then strMSG = "満足" 
if Request.QueryString("a") = "4" then strMSG = "まぁまぁ" 
if Request.QueryString("a") = "3" then strMSG = "どちらとも言えない" 
if Request.QueryString("a") = "2" then strMSG = "少し不満" 
if Request.QueryString("a") = "1" then strMSG = "不満" 
if Request.QueryString("a") = "0" then strMSG = "かなり不満"  'asp013追加

If strMSG = "不正なパラメーターです" Then 'エラーパラメータのままか?チェック
    Response.Write "データを正しく受け取れませんでした<br>"
Else
    'FileSystemObjectを生成します。
    Set objFS = Server.CreateObject("Scripting.FileSystemObject")

    'test013.txt を追加モードで開く  012 --> 013へ
    Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 8, True)

    'ファイルにアンケート結果のデータを書き込む
    ts.write Request.QueryString("a") & ","   '結果0〜6を書く
    ts.write strMSG & ","    'ファイルに結果を書き込む
    ts.write Now             '時刻を書く

    ts.write chr(13) & chr(10)  '改行する

    '*4使ったファイルは閉じようよ
    ts.close
End if

Response.Write "パラメーターは<b>" & strMSG & "</b>"  '表示もついでに行う

%>
<hr>
回答、<b>ありがとうございます</b><br>
<A HREF="test013.txt" target="_new">結果の生データ、test013.txtを見る</A><br>
<br>
</body>
</html>
-- ここまで --

余裕だね、次は、結果の集計だよね。

ウ.読み込み・集計部、test012-2.aspを修正してtest013-2.aspを作成

これも同様にまず、コピーして、test013-2.aspを作成するよ。
同じように、012を013へ、
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

Ken3)メルマガ書くのも時間かかったけどここまでコピーだった(笑)

-- 修正後のtest013-2.asp  --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>7段階評価に増やしてみた</title>
</head>
<body>
<h2>7段階評価に増やしてみた</h2>
test013-2.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT06     '大変満足 カウンター asp013で修正
dim nCNT05     '満足 カウンター
dim nCNT04     'まぁまぁ カウンター
dim nCNT03     'どちらとも言えない カウンター
dim nCNT02     '少し不満 カウンター
dim nCNT01     '不満 カウンター
dim nCNT00     'かなり不満 カウンター asp013で修正

nCNT00 = 0 'asp013
nCNT01 = 0 '*1 カウンターを初期化しておく
nCNT02 = 0
nCNT03 = 0
nCNT04 = 0
nCNT05 = 0
nCNT06 = 0 'asp013

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*2 Left関数を使って左から1文字目を判断、見つかったらカウントアップ
    Select Case Left(strRECORD, 1)  '読みこんだレコードの1文字目
        Case "6": nCNT06 = nCNT06 + 1  'asp013
        Case "5": nCNT05 = nCNT05 + 1
        Case "4": nCNT04 = nCNT04 + 1
        Case "3": nCNT03 = nCNT03 + 1
        Case "2": nCNT02 = nCNT02 + 1
        Case "1": nCNT01 = nCNT01 + 1
        Case "0": nCNT00 = nCNT00 + 1  'asp013
    End Select
Loop

ts.close  '使ったファイルは閉じようよ

'*3結果の表示
Response.Write "6、大変満足は、" & nCNT06 & "人<BR>"   'asp013
Response.Write "5、満足は、" & nCNT05 & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT04 & "人<BR>"
Response.Write "3、どちらとも言えないは、" & nCNT03 & "人<BR>"
Response.Write "2、少し不満は、" & nCNT02 & "人<BR>"
Response.Write "1、不満は、" & nCNT01 & "人<BR>"
Response.Write "0、かなり不満は、" & nCNT00 & "人<BR>" 'asp013
%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
<hr>
</body>
</html>
--

修正完了、できたよ三流師匠。

テストはしたの?
あっ、やってないや、でもこんなの動くでしょ。

やってよ、修正ミスあるかもしれないんだから。

http://www.ken3.org/cgi-bin/test/test013.html
でフォームからの入力

http://www.ken3.org/cgi-bin/test/test013-1.asp?a=6  6、大変満足
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=1  1、不満
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=0  0、かなり不満、解除する
直接クリックもOK

集計結果
http://www.ken3.org/cgi-bin/test/test013-2.asp
を
テキストファイル
http://www.ken3.org/cgi-bin/test/test013.txt
と比べて、テストしておいてね。

まぁ、これぐらいの修正は、カッペ君でも余裕かなぁ。
テスト結果を寝て待つかな。

/*
 * 4.配列変数の使用
*/

ここまで、お付き合いどうも。
新キャラ、カッペ君は、、書いててイマイチでしたね。
(今後登場するかは微妙かなぁ)

ふざけてるとまた、マジメな人からお叱りメール届くので、
ここらから少しだけマジメに。

なんか、修正してて(聞いてて)、バカっぽかったですよね。
そんなキャラもありだけど、配列変数とループを使用すると、
少しはキレイに書けるんですよ。

配列変数って?なに?

通常の変数って、
A = 10 や CNT1 = 5, CNT2 = 20 と変数名を付けて値を代入したりしてました。
配列変数ってのは、
Dim A(10)
A(1) = 2 : A(5) = 6
みたいに、
変数名(インデックス)
で、複数の値を管理できるんですよ。
ExcelのセルでA1,A2,A3
が、
A(1) A(2) A(3)
みたいな感じで(チョット違うか)

ポイントを書くと、
変数の宣言方法が、
Dim 変数名(要素の数)
使う時は、
変数名(インデックス)
です。

くだらねぇ解説はいいからさ、なんで便利なんだよ。
(詳細はヘルプ見るから、とっとと、プログラム書けよ)

-- test013-3.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>配列変数を使用してみた</title>
</head>
<body>
<h2>配列変数を使用してみた</h2>
test013-3.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   '*1 カウンター 変数 10個もいらないけど

'*2 カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
Loop

ts.close  '使ったファイルは閉じようよ

'*5結果の表示
Response.Write "6、大変満足は、" & nCNT(6) & "人<BR>" 
Response.Write "5、満足は、" & nCNT(5) & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT(4) & "人<BR>"
Response.Write "3、どちらとも言えないは、" & nCNT(3) & "人<BR>"
Response.Write "2、少し不満は、" & nCNT(2) & "人<BR>"
Response.Write "1、不満は、" & nCNT(1) & "人<BR>"
Response.Write "0、かなり不満は、" & nCNT(0) & "人<BR>"
%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
<br>
</body>
</html>
---

まず、1つ目のポイントは、
dim nCNT(10)   '*1 カウンター 変数 10個もいらないけど
で、10個もいらないんだけど、
nCNT変数を配列で0から10使いますよと宣言

'*2 カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

ここは、
nCNT(0) = 0
nCNT(1) = 0
とやると、疲れるし、カッコつけたかったので
ループでまわして、
カウンターのi番目に0を代入、初期化してたんですね。

次が、集計部で、
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
とstrRECORDに1レコードデータが入ります。
4,まぁまぁ,2002/12/10 16:28:16
と変数に入っているので、

    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換

Left(strRECORD, 1)
は左から1文字取出す、ここでは4
その4を数値に変換するために、
Cint関数で変換し、変数iに入れてます。

    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1

ここでは、
nCNT(i番目) = nCNT(i番目) + 1
と評価の4番目がカウントアップされます。

最後の表示では、芸無く、
'*5結果の表示
Response.Write "6、大変満足は、" & nCNT(6) & "人<BR>" 
Response.Write "5、満足は、" & nCNT(5) & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT(4) & "人<BR>"
と、
nCNT(X番目)の値を表示します。
*ここも、次回の改造項目かなぁ。

どうでしょうか?
配列を使うと、スッキリするし、
10段階評価に増えた時も修正が楽ですよね。

配列の使い方、マスターすると、一味違ったプログラムが書けます。
ぜひマスターしてくださいね。

/*
 * 5.終わりの挨拶
*/

今回は、
・5段階から7段階評価へプログラム修正(カッペ君登場)
・配列の使い方、マスターすると、一味違ったプログラムが書けます
でした。

プログラムはいろいろな書き方あるので、
人をうならせるプログラムをみなさんは書いてくださいね。

でも、まだまだ、イマイチなんだよね。
いろいろとある改善点は次回に。
道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。


No.14 2002/12/11
外見の調整とArray関数を使用して配列作成
[ページTOPへ戻る]
<外見の調整とArray関数を使用して配列作成>

こんにちは、Ken3です。

前回は、
配列変数を使って、プログラムの中身をスッキリさせました。
でも、
世の中、中身も大切ですが、外見も重要みたいです。
男性も化粧する、そんな時代なので(オイオイ、ホントか?)
今回は、アンケート結果の出力に少し化粧してみます。(見やすく)
えっ、元が悪いと化粧もイミナイって?そんなぁ〜

あまり期待しないでね。

/*
 * 1.素顔で勝負(笑)、データを素で表示
*/

テキストファイルの処理もマンネリ化した今日この頃、
そろそろDBでもやるか?
じゃなくって、
アンケートの集計結果、そのまま下記のようにデータ件数を表示してます。

集計結果:  http://www.ken3.org/cgi-bin/test/test013-3.asp  より
----
6、大変満足は、1人
5、満足は、2人
4、まぁまぁは、1人
3、どちらとも言えないは、4人
2、少し不満は、2人
1、不満は、2人
0、かなり不満は、2人
----

見易いとは、お世辞でも言えないよね。
Ken3をヨイショする理由も無いし(笑)

家の中(社内システムなど身内しか見ない)や自分の部屋(マイマシーン)
ではいいかもしれないけど
外出る時は(インターネットで公開)、
少しぐらい化粧したら?

私は、素顔で勝負の女(男)だからね、いいよまわりは気にしないし。

それだと話が終わってしまうので、
そろそろ、マジメに見た目にこだわってみます。

/*
 * 2.<TABLE>タグでデータを整える(表にする)
*/

まずは、バラバラな出力を整えます。

6、大変満足は、1人
5、満足は、2人
4、まぁまぁは、1人
3、どちらとも言えないは、4人

を

評価                      人数
6 大変満足は、           1人
5 満足は、               2人
4 まぁまぁは、           1人
3 どちらとも言えないは、 4人

項目名を付けて、表にするか。


-- http://www.ken3.org/cgi-bin/test/test014-1.asp  
<%@LANGUAGE=VBScript%>
<html>
<head>
<title><TABLE>タグを使用してみた</title>
</head>
<body>
<h2><TABLE>タグを使用してみた</h2>
test014-1.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
Loop

ts.close  '使ったファイルは閉じようよ

'*1結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE>"
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD></TR>"
Response.Write "<TR><TD>6</TD><TD>大変満足</TD><TD>" & nCNT(6) & "</TD></TR>"
Response.Write "<TR><TD>5</TD><TD>満足</TD><TD>" & nCNT(5) & "</TD></TR>"
Response.Write "<TR><TD>4</TD><TD>まぁまぁ</TD><TD>" & nCNT(4) & "</TD></TR>"
Response.Write "<TR><TD>3</TD><TD>どちらとも言えない</TD><TD>" & nCNT(3) & "</TD></TR>"
Response.Write "<TR><TD>2</TD><TD>少し不満</TD><TD>" & nCNT(2) & "</TD></TR>"
Response.Write "<TR><TD>1</TD><TD>不満</TD><TD>" & nCNT(1) & "</TD></TR>"
Response.Write "<TR><TD>0</TD><TD>かなり不満</TD><TD>" & nCNT(0) & "</TD></TR>"
Response.Write "</TABLE>"

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
-- 

実行すると、結果の表示は、こんな感じでした。
評価 コメント          人数 
6   大変満足           1 
5   満足               2 
4   まぁまぁ           1 
3   どちらとも言えない 2 
2   少し不満           2 
1   不満               1 
0   かなり不満         1 


'*1結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE>"
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD></TR>"
Response.Write "<TR><TD>6</TD><TD>大変満足</TD><TD>" & nCNT(6) & "</TD></TR>"
Response.Write "<TR><TD>5</TD><TD>満足</TD><TD>" & nCNT(5) & "</TD></TR>"
Response.Write "<TR><TD>4</TD><TD>まぁまぁ</TD><TD>" & nCNT(4) & "</TD></TR>"
Response.Write "<TR><TD>3</TD><TD>どちらとも言えない</TD><TD>" & nCNT(3) & "</TD></TR>"
Response.Write "<TR><TD>2</TD><TD>少し不満</TD><TD>" & nCNT(2) & "</TD></TR>"
Response.Write "<TR><TD>1</TD><TD>不満</TD><TD>" & nCNT(1) & "</TD></TR>"
Response.Write "<TR><TD>0</TD><TD>かなり不満</TD><TD>" & nCNT(0) & "</TD></TR>"
Response.Write "</TABLE>"
が
修正したプログラム場所です。

化粧と言うか、ぷっ(笑)、厚化粧だよね。
ほんと、ほんと、自分でも笑っちゃうよね書いてて。

/*
 * 3.Arrayを使って配列を初期化
*/

さて、中途半端に厚化粧したけど、本人も納得してないので、
気分を変えて、中身の処理も少し変えてみます。

配列の初期化で、Array関数を使った方法があります。
strBOX = Array("満足","普通","不満")
とやると、
strBOX(0)に満足、(1)に普通...と配列の0番目からデータを作成してくれます。

こいつを使用して、下記のように書いてみました。

-- http://www.ken3.org/cgi-bin/test/test014-2.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>Array関数を使用して配列の初期化</title>
</head>
<body>
<h2>Array関数を使用して配列の初期化</h2>
test014-2.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   'カウンター 変数 10個もいらないけど

'カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
Loop

ts.close  '使ったファイルは閉じようよ

'*2Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")

'*1結果の表示を<TABLE>タグを使用して表示
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD></TR>"
'*3ループで回してデータを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD></TR>"
Next

Response.Write "</TABLE>"   '忘れずにテーブルを終わりにする

%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
</body>
</html>
---

修正したポイントを書くと、
まず、使用する評価コメントを配列に代入しました。

'*2Array関数を使用して、評価コメントを初期化
strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _
               "まぁまぁ", "満足", "大変満足")
と、Array関数を使ってます。

隠された?ポイントとして、
 "どちらとも言えない", _ ←ここのアンダーバー気になりました?
一行に命令やパラメータを書けない時や、
書けてもダラダラと続けるのがイヤな時、
_ を行末に付けて、記述することができます。

次に表示で、ループ処理を使って、各配列を6〜0まで表示してます。

'*3ループで回してデータを表示する
For i = 6 To 0 Step -1   '6〜0のループを作る
	Response.Write "<TR><TD>" & i & "</TD>"
    Response.Write "<TD>" & strBOX(i) & "</TD>"
    Response.Write "<TD>" & nCNT(i) & "</TD></TR>"
Next

ポイントは、
For i = 6 To 0 Step -1
で、通常はカウンターは+1していくのを、
Step −1
で、6から−1してます。

表示が同じだと、芸が無いので、
Response.Write "<TABLE border=1>"   'border=1で境界線(ワクを表示)
とTABLEタグのパラメータ、境界線border=1として、ワクを書いて見ました。

/*
 * 4.プログラムも大事、見せ方も大事
*/

まぁ、言いたかったのは、

前回は、同じ処理をするんだけど、
今後の修正・保守性を考えたプログラムを書きましょう。

今回は、同じ内容のデータを出力するんだけど、
見えない中身よりも、目に見える外見も重要ですよ。
集計結果表示:
http://www.ken3.org/cgi-bin/test/test013-3.asp  ←そのまま人数を表示
http://www.ken3.org/cgi-bin/test/test014-1.asp  ←表(TABLE)にした
http://www.ken3.org/cgi-bin/test/test014-2.asp  ←表にワクをつけた
でした。

まぁ、中身も外見もバランス良くですが。
(さらに進むと、厚化粧で時間をかけるよりは、そのままでもって意見もあるよ)

/*
 * 5.終わりの挨拶
*/

今回は、
・TABLEタグを使ってデータの見せ方を変えてみた
・Arrayを使って配列を初期化
・中身と外見のお話
でした。

結果の見せ方も、いろいろな書き方あるので、
人を振り向かせる、夢中にさせるページをみなさんは書いてくださいね。

姿だけ美人やイケメン君でも中身が無いと、すぐにフラレでしまうけどね。
えっ、中身はそんなに変わらないんだから、美人・イケメンのほうがいいって?
う〜ん、、、まぁ、バランスだと思うけど(笑)

最強ページへの道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。



ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]