DOBON.NETプログラミング道掲示板

■34585 / 親記事)  VB.netにおける固定長出力方法
  
□投稿者/ rarara 一般人(1回)-(2020/11/27(Fri) 13:54:57)
  • アイコン環境/言語:[Windows10 64bit] 
    分類:[.NET] 

    現在VB.netにて固定長のテキストファイルを作成する開発を行っております。
    今のところうまく動いているようですが、引数が正しいのかが判断できず相談させて頂く次第です。ちなみに1行毎に改行を挟みます。
    ※ネットで調べてはみましたがあまり理解できず・・・。

    <前提条件>
    ・ヘッダーのレコード長は1208
    ・明細のレコード長は141

    <実際のコード>

    'ヘッダー配列の定義
    Private Structure ヘッダ_PROPERTY
    <VBFixedString(2)> Dim Header1 As String


    <VBFixedString(27)> Dim Header5 As String
    End Structure

    '明細配列の定義
    Private Structure 明細_PROPERTY
    <VBFixedString(2)> Dim Detail1 As String


    <VBFixedString(27)> Dim Detail5 As String
    End Structure


    ※ファイル出力部分
    'ファイル作成およびオープン
    FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.Write, OpenShare.LockWrite, 1208)

    'ヘッダーの配列に出力値を設定

    'ヘッダー内容をファイルへ出力
    FileSystem.FilePut(FileNo, ヘッダPROPERTY, RECNO)

    '明細の配列に出力値を設定

    'ヘッダー内容をファイルへ出力
    FileSystem.FilePut(FileNo, 明細PROPERTY, RECNO)



    上記のようにコードを書いており、現状は問題なく動いているようですが
    「FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.Write, OpenShare.LockWrite, 1208)」の1208が正しいのかが判断できません。

    1208と設定しているのはヘッダーのレコード長が1208であるためですが、ここで1208と設定してしまうと以降も1208バイトずつ出力されると思っていたのですがそうでもないようです。

    ここの部分には一体何を値を引数として渡すべきでしょうか。
    ちなみに改行は、ヘッダーや明細の配列の最後の項目に改行コードを入れて対応しています。
マルチポストを報告
違反を報告
引用返信 削除キー/
■34586 / ResNo.1)  Re[1]: VB.netにおける固定長出力方法
□投稿者/ rarara 一般人(3回)-(2020/11/27(Fri) 16:28:47)
  • アイコン投稿主です。
    すみません、うまくいっていたのは2行で確認したからであって、3行目以降は1208バイトずつ出力されていました。

    恐れ入りますが、どのように対処すべきかご教示頂けないでしょうか。
違反を報告
引用返信 削除キー/
■34589 / ResNo.2)  Re[2]: VB.netにおける固定長出力方法
□投稿者/ shu 大御所(491回)-(2020/12/01(Tue) 13:55:43)
  • アイコン
    No34586に返信(rararaさんの記事)
    
    
    行毎にサイズが違うのであれば提示された方法は利用できません。
    また記述が古い方法であるので、推奨されません。
    以下、半角文字(ASCII)のみと仮定したサンプルです。
    
    
    Imports System.IO
    Imports System.Text
    
    
    
            Dim enc = Encoding.ASCII
    
            Using stm = File.OpenWrite("D:\work\test.txt")
                '行内容編集用バッファ最大byte数確保
                Dim buf = New Byte(50) {}
    
                Dim wrt As New BinaryWriter(stm)
                'ヘッダ(50byte)
                Dim hd As New MemoryStream(buf)
                hd.Write(enc.GetBytes("ab"))
                hd.Write(enc.GetBytes("cd"))
                hd.Write(enc.GetBytes(New String(" "c, 48 - hd.Position)))
                hd.Write(enc.GetBytes(vbCrLf))
                wrt.Write(buf, 0, 50)
                '明細(10byte)
                For i = 1 To 5
                    Dim dtl As New MemoryStream(buf)
                    dtl.Write(enc.GetBytes(i.ToString("00")))
                    dtl.Write(enc.GetBytes("abc" & i))
                    dtl.Write(enc.GetBytes(New String(" "c, 8 - dtl.Position)))
                    dtl.Write(enc.GetBytes(vbCrLf))
                    wrt.Write(buf, 0, 10)
                Next
            End Using
    

違反を報告
引用返信 削除キー/
■34590 / ResNo.3)  Re[3]: VB.netにおける固定長出力方法
□投稿者/ rarara 一般人(1回)-(2020/12/02(Wed) 10:17:26)
  • アイコン返信が遅れてしまい、申し訳ありません。

    > 行毎にサイズが違うのであれば提示された方法は利用できません。
    やっぱりそうだったのですね・・・。

    > また記述が古い方法であるので、推奨されません。
    そうなのですね、ネットで検索した際に出てきたもので参考としていました。

    > 以下、半角文字(ASCII)のみと仮定したサンプルです。
    ありがとうございます。記載頂いた内容で解決できました。
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -