• ベストアンサー

VBSでテキストファイルの文字列の桁数を調べたい

VBSでテキストファイルを1行ずつ読み、ある桁からある項目A(20桁)が始まるとします。 項目Aは漢字が入ります。後ろ空白(1バイト空白)詰めです。 その項目Aの桁数を調べるにはどのようにVBSを組めばよいのでしょうか? VBSでMid関数とかLen関数を使ってもうまく計算してくれてないような感じなのです。 例えば 桁 →123456789012345678901234567890 data1→aaaaaaaaaこんばんわ data2→aaaaaaaaaおつかれ で strRec1 = Mid(strRecord,10,20)  とした場合、stRec1には項目Aが入る予定 data1なら5、data2なら4と返ってきてほしいのです。 ちなみにMidBでもそれぞれ10,8で返ってきてもいいです。 言い換えると、桁n~桁mまでの項目に何桁の漢字があるかを調べたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

SJIS(ASCII)としてカウント(半角1バイト、全角2バイト)で 文字列を取りたいということでしょうか? 上記の例でいくと、「data1→aaaaaaaaaこんばんわ 」の長さは 20というバイト数(桁数ではありません)が帰ってくれば OKということですよね?(Lenだと15が帰ってくるから) もし、そうであれば、下記のようなバイト数を取得する コードを組まなければなりません。 (半角=1バイト、全角=2バイト) 理由:Lenは桁数を読み込んでしまうので、バイトはカウントしません。また、LenBという関数があるんですが、UNICODEでの計算になるので、1文字=2バイトになってしまいます。 ■Lenの場合 dim data1 data1 = "aaaaaaaaaこんばんわ" msgbox CountLen(data1) function CountLen(byval data)   dim i   dim c   dim counter   counter = 0   for i = 1 To Len(data)     c = asc(mid(data, i, 1))     if c >= &H00 and c <= &H7E then       counter = counter + 1     else       counter = counter + 2     end if   next   CountLen = counter end function ■Midの場合 dim data2 data2 = "aaaaaaaaaおつかれ" msgbox OriginalMid(data2, 9, 3) function OriginalMid(byval data, byval startIndex, byval length)   dim i   dim c   dim counter   dim returnValue   counter = 0   returnValue = ""   for i = 1 To Len(data)     c = asc(mid(data, i, 1))     if c >= &H00 and c <= &H7E then       counter = counter + 1     else       counter = counter + 2     end if     if (counter >= startIndex) and (counter <= startIndex + length - 1) then       returnValue = returnValue & chr(c)     end if     if counter >= startIndex + length then       OriginalMid = returnValue       exit function     end if   next end function

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

私が簡単な例でやるとおかしくないように思うのですが。 メモ帳に下記作成。拡張子.VBSで保存。 Dim fso,f1,objText Set fso = CreateObject("Scripting.FileSystemObject") '-- Set f1 = fso.GetFile("C:\Documents and Settings\xxxx\My Documents\text12.txt") set objText=f1.OpenAsTextStream(1) Do While objText.AtendOfLine <> True s=objText.ReadLine MsgBox s s1= mid(s,10,len(s)-9) MsgBox len(s1) Loop objText.Close Set objText=Nothing Set f1=Nothing set fso=Nothing (テキストファイルのあり場所は修正のこと) ーーー text12.txt 例データ 123456789東京都大田区 aaaaaaaaa横浜市 eeee12344こんにちは 333334444Clasification ーー 6,3,5、13と表示されました。 この例やコード内容はおかしいですか。

全文を見る
すると、全ての回答が全文表示されます。
  • x0000x
  • ベストアンサー率52% (67/127)
回答No.2

>テキストファイルを1行ずつ読み、ある桁からある項目A(20桁)…項目Aは漢字が入ります。後ろ空白(1バイト空白)詰めです。 項目Aが発生するまでは、半角文字列だけですか? であるなら、項目Aは strRec1 =Mid(strRecord,10,20) で正しいです。 漢字桁数は空白(全角や半角)を含まない桁数であれば、 strRec1 =Mid(strRecord,10,20) LenB(Trim(Replace(strRec1,"□",""))) 'バイト数 Len(Trim(Replace(strRec1,"□",""))) '文字数 です。 さらに、項目Aまでの間に半角と全角が混在するなら strRec1 = StrConv(MidB(StrConv(strRecord, vbFromUnicode), 10, 20), vbUnicode) LenB(Trim(Replace(strRec1,"□",""))) 'バイト数 Len(Trim(Replace(strRec1,"□",""))) '文字数 です。 項目Aに半角と全角が混在したバイト数を取得するなら strRec1 = StrConv(MidB(StrConv(strRecord, vbFromUnicode), 10, 20), vbUnicode) strRec1 = Trim(Replace(strRec1,"□","")) LenB(StrConv(strRecord, vbFromUnicode)) 'バイト数 こんな感じで如何ですか? ※ 上記の"□"は全角の空白を示します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列の途中の空白を除く、また、A列の桁数に応じてB列に異なる値を記入する方法

     初心者です。エクセル2000を使います。年は若くないです。  次のことで困っています。データが多いため、ひとつひとつを手で訂正できないのです。 1.セル内の文字列に含まれる空白(スペース)を除く方法   例えば、 東 いろは→→東いろは   空白を置換して除こうとしましたがうまくいきませんでした 2.A列の数字の桁数に応じて、B列に異なる数字を入れる方法。以前に教えていただいた方法+α が必要なのです。   A列の数字が 4桁 なら B列に 01を入力   A列の数字が 6桁 なら B列に 60を入力   A列の数字が 7桁 なら B列に 06を入力   A列の数字が 8桁 なら B列にA列の数字の上位2桁を入力 したいのです。前回次のような数式を教えてえていただきました。  =IF(LEN(A1)=4,"01",IF(LEN(A1)=6,"60",IF(LEN(A1)=7,"06",""))) 8桁のときの数式の組み立て(条件判断、表示の仕方)が分からず、困っています。教えて下さい。

  • 文字列操作

    VB6の質問です。 下記のような桁数不定の取得データがございます。 桁数不定の為、Mid, Left, Right関数が使用できません。 Buffer = "A12345...B678910...C" 区切り文字A、B、Cを除いてデータを取り出したのですが、どのような方法がございますか? Data1 ="12345..." Data2 ="678910..."

  • 特定文字列の抽出

    VB6の質問です。 桁数、データが不定の文字列中から特定文字を抽出したいのでが、方法を教えていただけないでしょうか? 抽出したいデータの桁数が毎回不定でMid, Left, Right関数が使用できません。 Dim Buffer As String Buffer = "A12345...B678910.TRAGET..C" '桁数、データが不定の文字列がBufferに入ります。 例えば、変数Bufferから、桁数を考慮しないで"TARGET"の文字列を抽出したのです。 InStr関数で、位置を特定して、Mid関数などで抽出するれば、良いと思うのですが これをどんな桁数のときも対応できるようにルーチン化にできないでしょうか?

  • EXCELの関数でデータの桁数を揃える

    桁数が1桁と2桁の混在したデータがあります。 (0,1,10,22,3,5) 機械的に入るデータなので結果を桁数を揃えたいと思っています。 (00,01,10,22,03,05) 関数などを組み合わせて桁数を揃えることは可能でしょうか?

  • 有効桁数について

    ある数値を5回測定したとします A 5.039 B 5.075 C 5.092 D 5.064 E 5.058 有効桁数はすべて4桁ですよね? 次にA~Eの平均を取ると (A+B+C+D+E)/5=5.0656 と関数電卓で結果がでますが、4桁に丸めて5.066とすれば有効桁数の扱い方としては問題ないですか? そしてA~Eの平均の2乗をするときは、上記の平均を有効桁数4桁に丸めた5.066を2乗して (5.066)^2=25.664356 となり、そして5.066の有効桁数4桁に合わして25.66とすればいいのでしょうか? それとも平均の値を4桁に丸める前の電卓で出た値のまま2乗した後、最終的に4桁に丸めるのがいいのでしょうか?この数値だとどちらでやっても4桁にした値は変わりませんが・・・ 有効桁数の扱い方で問題があったら教えてください、また平均の2乗を求めるときはどちらが正しいのでしょうか? (平均の値の2乗は平均×平均なのだから平均の値を4桁にせず5桁として計算すると平均の2乗は有効桁数5桁と考えるので、やはり正しく平均の値を測定値の有効桁数4桁に丸めて出した平均の値を2乗する方が正しいですかね・・・)    また、上記の平均の計算をしたときのよな、「5」などの数字の有効桁数は何桁ですか?1桁なんでしょうか?もし1桁なら割り算をしているので有効桁数はいちばん桁数の少ないものに合わせるので有効桁数1となると平均の値が「5」となりおかしいとおもうんですが・・・ 上記の平均を取ったときの「5」や、測定回数の数値や、測定していない数で100で割れと書いてあったりしたときは、それらの数字の桁数も考えなければならないんでしょうか? 読みづらい文章かもしれませんが、ご回答待っています。

  • テキストファイルに固定文字挿入

    テキストファイル"A.csv"があります。 3個目の「,」の後に数字6桁が入っています。 他の項目は桁数可変ですが、この部分は6桁固定です。 ex. あああああ,AAA,090523,ああああああ いい,BBBBB,090101,いいいい この"090523"を"09/05/23"と置換(2桁おきに"/"を挿入)したいのですが、スキルがないため方法がわかりません。 すでにあるファイルを処理するのであれば、Excel読み込み後に置換処理などでなんとかなると思いますが、日次で毎日ファイルが作成されるため、自動的に処理したいのです。 VBS、バッチなどのプログラムで一括で処理できないでしょうか。 お力添えをいただければありがたいです。 よろしくお願いいたします。

  • 【Access97】指定した桁数で区切りたい

    txtファイルをAccessへインポートした後、項目毎に区切るためにMid関数を使用していますが、全角文字を2桁として認識してくれず区切り位置がおかしくなってしまいます。 同様の作業をExcelでやっても同じでした(添付画像参照、データは一部項目のみ抜粋)。 項目数=30個、桁数=一行につき255桁(固定)、1つのtxtファイル内のデータ行=200行以上、そのtxtファイル数が数十個あるので毎回Excelの『区切り位置指定ウィザード』を使用するのも大変です。 何とかAccessの更新クエリーで作業したいのですが、指定した位置で区切る方法、もしくは全角文字を2桁として認識させる方法はありませんか?

  • MID関数について

    一桁から八桁までの任意の数字を1セルごとに分けたいのですが、MID関数では左から取り出すため桁数が変化すると使えません。 一桁目にMID(A1,1,1)から八桁目にMID(A1、8,1)を入れると1234が4321と逆になってしまいます。 12でも12345678と桁が違っても1セルごとにわけることはできないでしょうか

  • エクセルで、桁数の異なるデータ(整数)を抜きたしたいのですが?

    初心者です! エクセルで、例えばA列にある桁数の異なるデータ(整数)を抜きたしたいのですが、アドバイスをお願いします。 桁数は、9桁~11桁の3種類のデータがあり、例えば9桁のデータを抜き出すには、どのようにすればよいのでしょうか? 【例】 A列↓ 123456789 2345678910 45874521223 235461789 4567896541 89756413578 以上、宜しくお願いします。

  • データの桁数を揃える関数をご教示下さい。

    データの桁数を揃える関数をご教示下さい。 セルの内容自体を同じ桁数の文字列としたいです。 また、桁数を揃える場合に、桁数の少ない場合には、 末尾に0を追加し、桁数を揃えたいです。 ex) 10桁と11桁と12桁の数字が混在 ⇒12桁に統一 120004561234(12)⇒120004561234(そのまま) 12000457131(11)⇒1200045713100(末尾に0を追加) 1200000562(10)⇒120000056200(末尾に00を追加) 以上、ご回答をよろしくお願いします。

インクBC-345/346の活用法は?
このQ&Aのポイント
  • 最近、TS3330からTS3530に買い替えました。未使用のBC-345/346が1セット残りました。
  • BC-345/346はTS3530には使用できないでしょうか?
  • 使用できない場合、活用方法がありますか?
回答を見る

専門家に質問してみよう