[リストへもどる]
一括表示

投稿時間:2004/01/15(Thu) 19:44
投稿者名:YU
Eメール:
URL :
タイトル:
教えて下さい。
はじめましてVB初心者の YU と言います。
現在、改行コードのついてないデータファイルを読み込み、
1レコード256バイト(文字)に区切って新規のファイルを作成するというプログラムの作成中です。
データの中身がすべて半角文字のデータだとうまくいくのですが、
全角文字のデータが入っているとうまくいきません。
解決方法を知っている方がいましたら終えて下さい。よろしくお願いします。

下記サンプル
    Dim IND$, OUTD$, LEND#

    Do While Not EOF(1)
        Line Input #1, IND
        LEND = 999999
        Do Until LEND = 0
            LEND = Val(Len(IND))
            If LEND = 0 Then
            Else
                OUTD = Mid$(IND, 1, 256)
                Print #2, OUTD
                IND = Mid$(IND, 256 + 1, LEND - 256)
            End If
        Loop
    Loop

投稿時間:2004/01/15(Thu) 19:57
投稿者名:nobu
Eメール:
URL :
タイトル:
Re: 教えて下さい。
> 現在、改行コードのついてないデータファイルを読み込み、
> 1レコード256バイト(文字)に区切って新規のファイルを作成するというプログラムの作成中です。
> データの中身がすべて半角文字のデータだとうまくいくのですが、
> 全角文字のデータが入っているとうまくいきません。

少なくてもこのHPにて質問をするなら事前に「逆引きヘルプ一覧表」に
目を通すべきではありませんか?
それがここの開設者・管理者さんへの最低限のマナーと思います。

文字列処理関係
   文字列を指定の幅にカットする(漢字分断回避)

上記が参考になりませんか?

題名は質問内容を的確に表すものにしましょう。
「はじめにお読み下さい」にも目を通す方が良いでしょう!

投稿時間:2004/01/16(Fri) 14:04
投稿者名:ak
Eメール:
URL :
タイトル:
Re: 教えて下さい。
こんにちは。

サンプルでは256文字とってきていますが
1文字=1バイトではなく半角は1バイト、全角は2バイトです。

256文字中に全角が混じると256バイト以上になる為上手く
いかなかった訳です。

バイト数は 
LenB(StrConv("文字列",vbFromUnicode)) 
で取得することができます。

参考までにサンプルを記述しておきます。

Public Sub Test()
    Dim ii       As Integer
    Dim iFl      As Integer
    Dim lLen     As Long
    Dim lCutLen  As Long
    Dim sData    As String
    Dim sVal     As String
    Dim sTmp     As String
    Dim sTmp2    As String

    'テストデータ作成
    For ii = 1 To 26
        If ii Mod 2 = 1 Then
            sData = sData & String(255, Chr(64 + ii))
        Else
            sData = sData & StrConv(String(123, Chr(64 + ii)), vbWide)
        End If
    Next ii
    
    sTmp = sData
    
    'フリーファイル番号取得
    iFl = FreeFile()
    
    'ファイル出力処理
    Open "C:\Test.txt" For Output As #iFl
    
    Do Until Len(sTmp) = 0

        sTmp2 = StrConv(sTmp, vbFromUnicode)
        lLen = LenB(sTmp2)
        
        If lLen > 256 Then
        
            sVal = StrConv(LeftB$(sTmp2, 256), vbUnicode)
            
            lCutLen = Len(sVal)
            
            If Right$(sVal, 1) = vbNullChar Then
                 sVal = Left$(sVal, Len(sVal) - 1) & " "
                 lCutLen = lCutLen - 1
            End If
            
        Else
            sVal = sTmp & Space$(256 - lLen)
            lCutLen = Len(sTmp)
        End If
        
        sTmp = Right$(sTmp, Len(sTmp) - lCutLen)
        
        Print #iFl, sVal
        
    Loop
    
    Close #iFl

End Sub