[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/01/26(Fri) 00:20
投稿者名:COBOL派プログラマー
Eメール:
URL :
タイトル:
マルチ様式でテキストを出力するプログラム
 初めまして。COBOL派プログラマーと申します。よろしくお願いします。
 現在 パソコンで固定長テキストファイルをマルチ様式可変長のテキストファイルに変換する
プログラムをVB6で開発しようとして大いにはまっております。
 このようなプログラムを組む場合、どのように入出力部分を作るべきでしょうか。
                 記
1.処理概要
 (1)伝票ヘッダー、伝票明細、合計の3種類のレコードをランダムにテキストファイルに
    書き出す。それぞれ異なるレコード長を持ち、各レコードの組み合わせはランダムに
    発生する。
 (2)1レコードごとに改行コードで区切って出力する。

2.試行錯誤の経過
 (1)まず 3種類のレコードをバイナリー改行コード付きの構造体で実装し、レコード長
    指定なしでOPENした出力ファイルにPUT文で出力しようとするとエラーになってしまい
    ました。
 (2)次に (1)のOPEN文をレコード長指定付きに改めると書き込みはできました。
    PUT文については (1)のエラーの原因は レコード長指定がなかったことと
    推定しました。この時点ではとりあえずレコード長を最も長い伝票ヘッダーの長さに
    していました。
    書き込みまでは確かに出来たのですが、ファイルのレングスより短い伝票明細の2
    レコード目移行がきっちり左詰めされず、改行コードの次に余計な余白が出現する
    状態で書き込まれてしまいました。
 (3)そこで、次に レコード種類の変わり目で一旦出力ファイルをCLOSEし、新しいレコード
    長でOPENし直すように改めてみました。
    ところが、これではレコード長さが替わる直前のレコードの開始位置から次のレコード
    位置が計算されているらしく、既に書き込んだレコードが破壊される事態となってしま
    いました。
 (4)今度は書き込み命令を Put からWriteに変えてみました。
    ようやくマルチ様式のレコードイメージにかなり近づいたかに見えました。
    しかし・・・・今度は勝手にレコードの開始と終了の部分に '"' が付いた形で
    書き込まれてしまいました。
    テキストに引用符が着かず、改行マークだけで区切られた状態での出力が欲しいので
    す。

  イメージとしては(4)が一番近いのです。
  このような場合、どう作りこめばよかったのでしょうか。
  できればサンプルコーディングも見せていただければ幸いです。
  よろしくお願いします。

投稿時間:2007/01/26(Fri) 02:16
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: マルチ様式でテキストを出力するプログラム
>  (1)伝票ヘッダー、伝票明細、合計の3種類のレコードをランダムにテキストファイルに
>     書き出す。それぞれ異なるレコード長を持ち、各レコードの組み合わせはランダムに
>     発生する。
>  (2)1レコードごとに改行コードで区切って出力する。
その仕様だと、ファイルの作成時は良いとしても、ファイルの読み込みの際に、
それぞれのレコードが「ヘッダ レコード」「明細レコード」「合計レコード」の
いずれなのか、判別できないのでは?


>   このような場合、どう作りこめばよかったのでしょうか。
レコード長が異なるのであれば、ランダムアクセスでの書き込みは無理でしょう。

作成するのがテキストデータのみであれば、Output モードか Append モードで開いて、
Print # で作成するのが良いかと思います。

バイナリデータも含まれるのであれば、Binary モードで Open して、
伝票ヘッダ、明細、合計のそれぞれのデータを Put # で作成すればよいかと。

投稿時間:2007/01/27(Sat) 00:54
投稿者名:COBOL派プログラマー
Eメール:
URL :
タイトル:
Re^2: マルチ様式でテキストを出力するプログラム
 ありがとうございました。
 無事解決しました。
 ところで、今回相談したフォーマットには、一部漢字項目が含まれていました。
 出力様式をテキストタイプで編集(Mid関数利用)すると桁ズレが発生したので、結局
構造体を定義してバイナリで出力しました。
 漢字が含まれる場合は構造体を定義してバイナリで書き込むのが一番無難なのでしょうか。

投稿時間:2007/01/29(Mon) 10:22
投稿者名:もげ
Eメール:
URL :
タイトル:
Re^3: マルチ様式でテキストを出力するプログラム
>  漢字が含まれる場合は構造体を定義してバイナリで書き込むのが一番無難なのでしょうか。

Mid関数は文字数で判断しますので、
バイト数で判断する場合は、
文字列の一部をバイト単位で取り出す (LeftB, MidB, RightB)
http://jeanne.wankuma.com/tips/string/leftb.html
(の一番下のほう)

その際には、
文字列を指定の幅にカット(漢字分断回避)      (081)
http://hanatyan.sakura.ne.jp/vbhlp/mozi_cut.htm
のような工夫が必要な場合があります。