|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"COBOL3形式ファイルを 他の形式にコンバート。"
COBOL3のファイルのデータ部を 他のファイル形式(Paradox等)に変換する場合の
数値データの取扱い例 です。
コードは JIS8 を想定していますので コード変換処理は 行っていません。
Main処理では 適当に Try... Except... を使用して下さい。
出力ファイルは おまかせです。(^^)
{*------------------------------------------------*}
{* 使用例 Main処理 *}
{*------------------------------------------------*}
//COBOL3のレコード定義例
type
TABCRec = record // ****マスター
Check: array[1..2] of Char; // X(2)
Name1: array[1..8] of Char; // X(8)
Name2: array[1..4] of Char; // S9(5)v9(2) comp-3
Name3: array[1..5] of Char; // S9(9) comp-3
Name4: array[1..4] of Char; // S9(4)
dummey: array[1..1] of Char; // ダミー
end;
//COBOL3のファイルREAD(Streamを使用しています。)
Const
ABCSize = SizeOf(TABCRec); //2+21+1
var
SrName: String; //変換対象Cobolファイル名
ABCRec: TABCRec;
FileEnd: Boolean;
RLen: Integer;
FileEnd := False;
Stream := TFileStream.Create(SrName,fmOpenRead);
try
Stream.Seek(128, soFromBeginning); //Head部読み飛ばし
while not FileEnd do
begin
RLen := Stream.Read(ABCRec,ABCSize);
if RLen = ABCSize then
begin
if IsAliveData(ABCRec.Check[1]) then
begin
***** := Trim(ABCRec.Name1);
***** := CBLNumChange(ABCRec.Name2,2,True);
***** := CBLNumChange(ABCRec.Name3,0,True);
***** := CBLNumChange(ABCRec.Name4,0,False);
{ファイル出力}
end;
end
else
FileEnd := True;
end;
finally
Stream.Free;
end;
{*----------------------------*}
{* Cobol3用 削除データの判定 *}
{*----------------------------*}
function IsAliveData(Check: Char): Boolean;
begin
Result := (ord(Check) shr 4) = 4;
{先頭バイト= $4X は正常データ}
end;
{*-----------------------------------------*}
{* COBOL形式.数値変換ルーチン *}
{*-----------------------------------------*}
{* TgStr: COBOL数値データ => Char形式 *}
{* Prec : 小数以下桁数 *}
{* IsPacked: Comp-3形式の場合 True *}
{*-----------------------------------------*}
function CBLNumChange(TgtStr: String; Prec:Integer;
IsPacked: Boolean): Extended;
var
N,M: Integer;
S: String;
Keta: Extended;
begin
Result := 0;
for N := 1 to Length(TgtStr) do //16進文字列に変換
S := S + Format('%.2x',[Ord(TgtStr[N])]);
M := Length(S);
Keta := 0.1;
if IsPacked then
begin
for N := M-1 downto 1 do
begin
Keta := Keta * 10;
Result := Result + StrToIntDef(S[N],0) * Keta;
end;
if Upcase(S[M]) = 'D' then
Result := - Result;
end
else
begin
N := M;
while N > 0 do
begin
Keta := Keta * 10;
Result := Result + StrToIntDef(S[N],0) * Keta;
N := N - 2;
end;
if Upcase(S[M-1]) = '7' then
Result := - Result;
end;
N := 0;
if Prec <> 0 then
repeat
Result := Result / 10;
Inc(N);
until N = Prec;
end;
=================================================================
草薙いっぺい(GBE02547) 00/07/19 20:40
Original document by 草薙いっぺい 氏 ID:(GBE02547)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|