固定長への変換について

解決


あこ  2004-09-21 07:29:39  No: 116391

また、お世話になります。

実は・・INIファイルにファイルの固定長の内容を定義保存して
データとなるテキストファイルの内容(漢字を含む)を
INIファイルで指定したバイト数で区切りたいのですが・・

下記のような読み込みと切り分けでは指定したバイト数で
取得されないのですが・・
何か方法がありましたらご教授のほど宜しくお願い致します。。。
-----------------------------------------
ファイルの読み込み
Open AppPath For input As FileFree

While Not EOF(FileFre)
    Line Input #FileFree,tmpStr
    s_rtn= s_rtn & tmpStr & vbCrLf
Wend
Close FileFree


'ini_file_naiyo---->INIファイルで指定したサイズ内容
s_rtn_taihi = MidB(s_str,1,ini_file_naiyo)

'サイズ分までの内容を取り除いたデータを取得
s_rtn = MidB(s_str,ini_file_naiyo + 1)

基本的なことかもしれませんが・・ご存知であれば教えてください。
宜しくお願い致しますm(_ _)m

環境はVB6.0になります。


特攻隊長まるるう  2004-09-21 19:32:46  No: 116392

文字コードを意識して無いと理解できない動きでしょう。
[Vb6.0]
Private Sub Form_Load()
    Call SampleLenB
End Sub

Function SampleLenB()
    Debug.Print Len("ABc") '---Unicode
    Debug.Print LenB("ABc") '---Unicode
    Debug.Print LenB(StrConv("ABc", vbFromUnicode)) '---ANSI
End Function

どんなデータを扱ってるのか分かりませんが、
過去ログ検索『vbFromUnicode』で色々引っかかります。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200312/03120157.txt
…とか参考になります?


特攻隊長まるるう  2004-09-21 20:02:59  No: 116393

↑のリンクのスレッド長いから…分かってないと何処を参考にすればいいか
分からないかもね。
ヘルプにも[2 バイト文字を含んだファイルの処理]とかいう題で載ってる
けど、文字列型 (String) 変数の代わりにバイト型 (Byte) の配列を
使用して、Unicode 文字の変換および ANSI 文字の変換が行われない
ようにしないといけません。…で、
>化石 2003/12/25(木) 10:59:57
を参考にして下さい。


あこ  2004-09-22 08:37:25  No: 116394

特攻隊長まるるうさま
いろいろありがとうございました。
とても参考になりました。

まだ、解決していないのですが・・
下記のロジックで試してみようと思っております。

'ini_file_naiyo---->INIファイルで指定したサイズ内容
s_str       = strConv(s_str,vbFromUnicode)
s_rtn_taihi = strConv(MidB(s_str,1,ini_file_naiyo)),vbUnicode)

'サイズ分までの内容を取り除いたデータを取得
s_str = MidB(s_str,ini_file_naiyo+1))


試みが  うまくいかなかったときは、またご指導のほど宜しくお願い致します。。


あこ  2004-09-22 19:01:59  No: 116395

特攻体長まるろうさま

さきほど 下記のロジックにて試しましたところ・・無事に解決いたしました。
もっと 改善したほうがいい点がありましたら ご指摘よろしくお願いいたします。

それから ReDim Preserve での2次元配列は可能でしょうか?
今のところ 2次元での再配列はエラーになっているので1次元でやっておりますが
できれば2次元配列で処理ができればいいなと思っております。

    '使用可能なファイル番号取得
    FileFree = FreeFile

    '読み込み
    Open AppPath For Input As FileFree
    
    While Not EOF(FileFree)
        Line Input #FileFree, tmpStr
        s_str = s_str & tmpStr
    Wend
    Close FileFree

'文字列の変換    
    s_str = StrConv(s_str, vbFromUnicode)
    
    Do Until LenB(s_str) < 256'(<--これは1レコードサイズを指定してます。)
    
        For i_cnt_1 = 1 To UBound(ini_file_naiyo)
        
            'エラー
            If LenB(s_str) < ini_file_naiyo(i_cnt_1) Then
                MsgBox "サイズエラーあり?"
                Exit For
            End If
            
            s_rtn_taihi = StrConv((MidB(s_str, 1, ini_file_naiyo(i_cnt_1))), vbUnicode)
            
            i_cnt_2 = i_cnt_2 + 1
            
            ’内容を配列に退避
            ReDim Preserve ps_データ配列(i_cnt_2)
            ps_データ配列(i_cnt_2) = s_rtn_taihi
            
            'サイズ分までの内容を取り除いたデータを取得
            s_str = MidB(s_str, ini_file_naiyo(i_cnt_1) + 1)
        Next i_cnt_1
    Loop


特攻隊長まるるう  2004-09-22 20:51:02  No: 116396

>もっと 改善したほうがいい点がありましたら ご指摘よろしくお願いいたします。
過去ログの化石さんの案を実現するならファイルの読み込みは
1行ずつループするのではなくて InputB を使って1ステップ
で終わります。
後半は…特に画期的な改善点は思い浮かばなかったのでパス。

…ああ、サンプルコードを載せる場合は変数宣言を省かないように
して下さい。それを解析して自分の環境で動くようにするのに結構
時間が掛かってしまいます。そんなに暇ではありませんので。

>それから ReDim Preserve での2次元配列は可能でしょうか?
ヘルプに書いてあります。
[ReDim ステートメント]より抜粋
>解説
>キーワード Preserve を指定した場合、変更できるのは、
>動的配列の最後の次元のサイズに限られます。また、次元
>数は変更できません。たとえば、…
読んで下さい。
全ての次元のサイズを変えたい場合は配列を2つ用意して
内容をコピーする関数を自作して下さい。


あこ  2004-09-23 04:09:18  No: 116397

特攻隊長まるるう さま

本当にありがとうございました。。
変数の指定をはずして載せてしまったこと 以後気をつけます(_ _)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加