出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

文字列の中の特定の文字の個数を取りたいのですが・・   いしたくさん [2002/02/14 15:15:40] [1646]
  Re:正規表現は遅いかな?   シナプスさん [2002/02/18 3:02:11] [1676]
  Re:文字列の中の特定の文字の個数を取りたいのですが・・   北岳さん [2002/02/14 15:47:46] [1647]
    Re:文字列の中の特定の文字の個数を取りたいのですが・・   いしたくさん [2002/02/14 15:54:32] [1648]
    for i=0 to n と for each、どっちが速い?   北岳さん [2002/02/14 16:56:38] [1651]
      Re:for i=0 to n と for each、どっちが速い?   いしたくさん [2002/02/14 17:41:20] [1652]
        Re:for i=0 to n と for each、どっちが速い?   なかさん [2002/02/14 18:16:54] [1653]
          Re:for i=0 to n と for each、どっちが速い?   いしたくさん [2002/02/14 18:23:28] [1654]
        ASCとCHRで   北岳さん [2002/02/14 18:54:54] [1655]
          Re:ASCとCHRで   なかさん [2002/02/14 19:52:19] [1657]
            Re:ASCとCHRで   いしたくさん [2002/02/14 20:54:54] [1658]
            Re:ASCとCHRで   北岳さん [2002/02/14 22:54:31] [1659]
              Re:ASCとCHRで   なかさん [2002/02/15 10:13:10] [1660]

[1646] 文字列の中の特定の文字の個数を取りたいのですが・・
投稿者:いしたくさん 2002/02/14 15:15:40
初心者なのでおかしいところは許してやってください。

このような文字列が変数に格納されています。

strAll = "a,b,b,c,a,d,e,a,f,a,b,c"

このここからたとえば"a"の数を取得するにはどうすればいいでしょうか。

前から順に探して位置を求めてmid関数で取ってというような処理をしなければいけませんか?

数百回繰り返す作業なのでできるだけシンプルに書きたいのです。

是非ご教授ください。

[1676] Re:正規表現は遅いかな?
投稿者:シナプスさん 2002/02/18 3:02:11
Option Explicit

Dim strAll
Dim strSearch
Dim lCount

strAll="a,b,b,c,a,d,e,a,f,a,b,c"
strSearch="a"

lCount=DataCount(strAll,strSearch)
Msgbox (lCount)

Function DataCount(strAll,strSearch)
Dim RegEX
Dim Matchs
Dim lngCount

Set regEX=New RegExp
regEX.Pattern=strSearch
regEX.Global = True


Set Matchs=regEX.Execute(strAll)
lngCount=Matchs.Count


Set Matchs=Nothing
Set RegEX=Nothing

DataCount=lngCount
End Function

[1647] Re:文字列の中の特定の文字の個数を取りたいのですが・・
投稿者:北岳さん 2002/02/14 15:47:46
特定文字区切りならsplit関数で配列に変えるのが速いと思います。
 
<1.ASP>
<%
dim ary
strAll = "a,b,b,c,a,d,e,a,f,a,b,c"
ary=split(strAll,",")
response.write "<br>配列下限番号=" & lbound(ary)
response.write "<br>配列上限番号=" & ubound(ary)
for i=lbound(ary) to ubound(ary)
response.write "<br>" & i & "=" & ary(i)
if ary(i)="a" then cnta=cnta+1
if ary(i)="b" then cntb=cntb+1
next
response.write "<hr>"
response.write "a の数=" & cnta & "<br>b の数=" & cntb
%>
 
<実行結果>
配列下限番号=0
配列上限番号=11
0=a
1=b
2=b
3=c
4=a
5=d
6=e
7=a
8=f
9=a
10=b
11=c
-----------
a の数=4
b の数=3

ちなみに
for i=0 to n 〜 next
形式の方が
for each x in ary 〜 next
形式よりも速いとか。(どこかで読みましたが、どこだかは失念。)

[1648] Re:文字列の中の特定の文字の個数を取りたいのですが・・
投稿者:いしたくさん 2002/02/14 15:54:32
なるほど。

わざわざソースまで・・・(涙)
本当にありがとうございます。

じっくりソース読んで勉強させていただきます。

ありがとうございました。

[1651] for i=0 to n と for each、どっちが速い?
投稿者:北岳さん 2002/02/14 16:56:38
> ちなみに
> for i=0 to n 〜 next
> 形式の方が
> for each x in ary 〜 next
> 形式よりも速いとか。(どこかで読みましたが、どこだかは失念。)
今まで逆の感じを受けていたので、念のため確認実験をしてみましょう。
 
<%
dim ary()
n=10000000
 
'---for i=1 to n形式
redim ary(n)
for i=1 to n
ary(i)=i
next
tim1=time()
for i=1 to n
dummy=ary(i)*ary(i)
next
tim2=time()
erase ary
T1=DateDiff("s",tim1,tim2)
response.write "<br>T1(秒)=" & T1
 
'---for each x 形式
redim ary(n)
for i=1 to n
ary(i)=i
next
tim3=time()
for each x in ary
dummy=x*x
next
tim4=time()
T2=DateDiff("s",tim3,tim4)
response.write "<br>T2(秒)=" & T2
%>
 
WIN2000、Pentium3、IIS5、ASP(VBScript 5.5)実行結果
T1(秒)=26
T2(秒)=20
 
2つのブロックを入れ替えても時間は変わらず。
 
あれ?どこかで読んだのと結果が逆じゃんか?
嘘が書いてあったか、読み間違いだったかしらね。
 
【結論】for i=1 to n よりも for each x 形式の方が速いです。

[1652] Re:for i=0 to n と for each、どっちが速い?
投稿者:いしたくさん 2002/02/14 17:41:20
なるほど。
僕も試して見ます。

やはり速いほうを使いたいですものね。
----------------------------------------
北岳さん。
いろいろ教えていただいて非常に感謝しています。
早速私のソースに組み込んで上手く動かすことが
出来ました。

で、さらに行き詰まっちゃったのですが、先ほど
教えていただいたサンプルソースのばあい、仮に
A,Bというものを数えていますよね。

でもはじめからAがあるのかBがあるのか何があるのか
わからないんですよ。

半角英字ということしかわかっていなくてですね。

この「strAll」の中にある要素に対してそれぞれの個数
を知りたいのです。

たとえば
strAll='A,B,A,C' であればA=2 B=1 C=1
strAll='A,P,G,P' であればA=1 P=2 G=1

です。前から順番にとって別の変数に入れてループして
その中でRedimしてともしあったら・・とか色々考えながら
やってるんですがパニックです。

訳がわかんなくなってしまいました。

是非今一度ヒントをいただければ幸いです。

[1653] Re:for i=0 to n と for each、どっちが速い?
投稿者:なかさん 2002/02/14 18:16:54
> 半角英字ということしかわかっていなくてですね。
で、1文字単位ということであれば、力業で(^^;
for each x in arr
select case (x)
case "a"
cnt_a = cnt_a + 1
以下、zまで
というやり方もありかと(^^;

配列で出来るかわかりませんが、

for each x in arr
Session(x) = Session(x) +1
next
で、全Session情報から、カウントをとるというてもありますね。
Cookieでも同じです

あくまでも、考え方としてみてください(^^;
# 思いつきで書いていますので

[1654] Re:for i=0 to n と for each、どっちが速い?
投稿者:いしたくさん 2002/02/14 18:23:28
なかさん。ありがとうございます。

>> for each x in arr
> select case (x)
> case "a"
> cnt_a = cnt_a + 1
> 以下、zまで

なるほど...そうですねえ。
若干不安かも・・
将来仕様変更でAAがありになったりしたら怖いですね。

>
> for each x in arr
> Session(x) = Session(x) +1
> next

なるほどーーー。こういう手もあるかー。
なるほどーーー。感心します。

> あくまでも、考え方としてみてください(^^;
> # 思いつきで書いていますので

参考になりました。ありがとうございます。

[1655] ASCとCHRで
投稿者:北岳さん 2002/02/14 18:54:54
おや、既にレスがついているようですが、折角なので載せときます。
 
ヒントを文章でややこしく書くよりも、簡単な場合はソースを書いて、説明抜きで載せるほうが楽ちんです。
以下を参考にして下さい。
1.aspの form 中から、自分自身(1.asp)を呼び出しています。
 
-------------1.asp--------------
<%
dim ary
dim su(255)
z=Request.form("moji")
s=Request.Form("kugiri")
if z<>"" then
ary=Split(z,s)
for each x in ary
i=asc(x)
su(i)=su(i)+1
next
end if
%>
<html><body bgcolor="#ffffee">
<form action="1.asp" method="post">
<p>文字を入力して下さい。
<input type="text" name="moji" value="<%= Request.form("moji") %>" size=50>
<p>区切り記号を入力して下さい。
<p>2文字以上で区切ると、最初の1文字のみ数えます。
<input type="text" name="kugiri" value="," size=6>
<input type="submit" value="送る">
</form>
<table border=1>
<tr><td>文字</td><td>数</td></tr>
<%
for i=0 to 255
if su(i)>0 then
%><tr><td><%= chr(i) %></td><td><%= su(i) %></td></tr>
<%
end if
next
%>
</table>
</body></html>

[1657] Re:ASCとCHRで
投稿者:なかさん 2002/02/14 19:52:19
# 別に喧嘩打ってるわけではないので、誤解無く(^^

> ヒントを文章でややこしく書くよりも、簡単な場合はソースを書いて、説明抜きで載せるほうが楽ちんです。

嫌みに聞こえるのは、私だけ?(^^ゞ
ソース書いているほどの、時間が無かったので、
思いつきで書いてみました。
確かに、混乱させる元になりますね

以後気を付けますm(__)m


[1658] Re:ASCとCHRで
投稿者:いしたくさん 2002/02/14 20:54:54
北岳さん、なかさん

私的にはどちらもすごく参考になりました。

ありがとうございました。

[1659] Re:ASCとCHRで
投稿者:北岳さん 2002/02/14 22:54:31
>>おや、既にレスがついているようですが、折角なので載せときます。
の次の数行は、なかさんのレスとは無関係です。
いしたくさんの(いつもはどなたの質問かなど、いちいち気に留めないのですが)
>わざわざソースまで・・・(涙)
>本当にありがとうございます即座に、
と、
>是非今一度ヒントをいただければ幸いです。
に対して書いたもので、投稿の際に冒頭に1行継ぎ足しました。
-------------
フリートークに私の「回答を書く際の想定読者」を載せました。

[1660] Re:ASCとCHRで
投稿者:なかさん 2002/02/15 10:13:10
了解です、私の勘違いですね(^^ゞ

フリートークの方を読んで、レス付けておきました。



TreeBBS For ASP V.0.1.3
Program By YasNet