Access引越し中小企業のAI導入支援|古い業務システムの作り直しからAccess・オフコンの引越し 専門

コラムやり方・手順

オフコンからデータを取り出すには?移行の前の固定長・パック10進・外字の変換と検算

オフコンからデータを移行のために取り出すには、固定長のレイアウト表、数字の形式(ゾーン10進・パック10進)、外字の対応表の3つをそろえます。3つがあれば、項目を切り出してCSVに直し、件数と合計金額で検算できます。合成した1,200件の固定長ファイルで読み方を4通り誤ってみると、どの誤りも件数・合計金額・外字の残りのどれかに表れました。(2026年10月時点)

全体の流れと費用はAccess・オフコンの引越しのページにまとめています。

要点

  • オフコンのデータは、固定長のレイアウト表・数字の形式・外字の対応表の3つがそろえば取り出せます。
  • 合成した1,200件の固定長ファイルでは、符号Dを読み落とすと件数は合ったまま合計金額が82,270,768円ずれました。
  • 富士通の日本語処理JEFの外字の領域は80A1〜A0FEで、マスの数を計算すると3,102あります。
  • 変換したら、件数・合計金額・数量×単価・外字の残りの4つを、オフコンの集計表と突き合わせます。
目次
  1. オフコンからデータを取り出すには、何をそろえればよいですか?
  2. 固定長のレイアウト表は、どこにありますか?
  3. ゾーン10進とパック10進は、どう読み分けますか?
  4. 外字は、どう変換すればよいですか?
  5. 変換したデータが正しいかは、どう確かめますか?
  6. このサイトで相談するには?
  7. よくある質問

オフコンからデータを取り出すには、何をそろえればよいですか?

固定長のレイアウト表、数字の形式(ゾーン10進とパック10進の別)、外字の対応表の3つです。3つがそろえば、ファイルを項目ごとに切り出して、CSV(UTF-8)に直せます。Access・オフコンの引越しを手伝うとき、Access引越しでは最初にこの3つがあるかを確かめます。

Impressの報道(2025年3月21日)によると、報道の対象の富士通系のASP型オフコンサービスは2031年3月末で提供を終えます。発表の原文は確かめられていません。保守の終わりを案内された会社は、プログラムより先にデータを取り出せるかを確かめると、計画を立てやすくなります。

3つのどれが欠けても、取り出したデータは使えません。

そろえるもの 中身 欠けると起きること
固定長のレイアウト表 項目の位置・長さ・形式、1レコードの長さ 項目の境目がずれ、ほぼ全件が読めない
数字の形式 ゾーン10進かパック10進か、符号と小数点の位置 金額が読めないか、返品のマイナスが消える
外字の対応表 外字のコードと、置き換える文字 社名や人名が〓や別の字になる

固定長のレイアウト表は、どこにありますか?

多くはオフコンの中のプログラムにあります。COBOLのCOPY句(項目の並びを書いた部品)やファイルの定義、紙の仕様書がレイアウト表の元になります。公開されているオフコンの移行サービスの例(2025年3月の報道)でも、移す対象にCOPY句やデータベースが挙がっています。

固定長のファイルには、カンマや改行がありません。1レコードが54バイトなら先頭から54バイトずつ切り、さらに「0〜6バイト目が伝票番号」のように項目へ分けます。境目を1バイトでも誤ると、後ろの項目がすべてずれます。

固定長ファイルの1レコード54バイトの図。伝票番号7・得意先コード5・伝票日付8・得意先名20・数量5バイトはゾーン10進か文字、単価4・金額5バイトはパック10進固定長ファイルの1レコード(54バイト、改行なし)レイアウト表の「位置・長さ・形式」を、バイトの並びに重ねた図。数字の項目は3つの形式がある伝票番号7バイト0得意先コード5バイト7伝票日付8バイト12得意先名20バイト20数量5バイト40単価4バイト45金額5バイト4954ゾーン10進1バイトに1桁。F0〜F9。符号は最後のバイトの上半分(C=正、D=負)パック10進1バイトに2桁。最後の半バイトが符号(C=正、D=負、F=符号なし)文字外字は対応表で置き換える。対応表にない字は〓にして件数を数える合成した架空のファイル(scripts/figs/offcon_extract.py)。実機の項目と長さは、会社ごとのレイアウト表で決まる
図1 合成した固定長ファイルのレイアウト。架空の例です。実際の項目と長さは、会社ごとのレイアウト表で決まります。

私が取り出すときは、まずファイルの大きさをレコード長で割ります。割り切れなければ、レイアウト表が古いか、改行や見出しの行が入っているかのどれかです。

ゾーン10進とパック10進は、どう読み分けますか?

ゾーン10進は1バイトに1桁、パック10進は1バイトに2桁を詰める形式です。レイアウト表やCOPY句にPACKED-DECIMAL(パック10進)の指定があるかで見分けます。

IBMのCOBOLの資料では、パック10進の符号は最後の半バイトに入り、正はC、負はDで作られます(符号なしはF)。ゾーン10進は、最後のバイトの上半分が符号です。「−12,345」をパック10進で書くと「12 34 5D」の3バイトです。ゾーン10進では「F1 F2 F3 F4 D5」の5バイトになります。

−12,345を16進で並べた比較図。ゾーン10進はF1 F2 F3 F4 D5の5バイト、パック10進は12 34 5Dの3バイトで、どちらも最後の半バイトのDが負の符号同じ「−12,345」が、形式によってどう並ぶか(16進)ゾーン10進は5バイト、パック10進は3バイト。符号は最後の半バイトに入るゾーン10進 S9(5)F1F2F3F4D5上半分の F はゾーン部。最後のバイトの上半分 D が符号(負)パック10進 S9(5)12345D数字を2桁ずつ詰める。最後の半バイト D が符号(負)文字として読むとパック10進の 12 34 5D を cp932 で読むと、制御文字・「4」・「]」になり、数字に戻らない読み方:ゾーン10進は各バイトの下半分をつなぐ。パック10進は半バイトずつつなぎ、最後の半バイトを符号にする符号の値は IBM の COBOL の資料(Sign representation of zoned and packed-decimal data)の表による。図は offcon_extract.py で作った
図2 ゾーン10進とパック10進の並び。符号の値はIBMのCOBOLの資料の表によります。

パック10進を文字として読むと、「12 34 5D」は制御文字と「4」「]」になり、数字には戻りません。Pythonでは、半バイトずつ取り出してつなげば読めます。

def unpack(b):
    nib = [v for x in b for v in (x >> 4, x & 0xF)]
    *digits, sign = nib
    n = int("".join(map(str, digits)))
    return -n if sign in (0xB, 0xD) else n

unpack(bytes.fromhex("12345D"))  # -12345

小数点の位置はファイルの中に入っていません。単価が「円」か「銭」までかは、レイアウト表の桁の指定で確かめます。

外字は、どう変換すればよいですか?

外字のコードと置き換える文字を1対1で並べた対応表を作り、変換のときに置き換えます。外字は会社ごとに作った文字なので、どの会社にも使える変換表はありません。

法務省の資料によると、富士通が開発した日本語処理の仕組みJEFでは、利用者定義文字(外字)の領域は80A1〜A0FEです。マスの数を計算すると3,102あり、どこに何の字を入れたかは会社ごとに違います。WindowsのShift_JIS(cp932)にも外字の領域があります。Pythonで確かめると、0xF040〜0xF9FCはUnicodeの私用領域の1,880字に対応します。

対応表は次の順に作ります。

  1. ファイル全体から外字の領域のコードを拾い、使われているコードと回数の一覧を作る。
  2. 一覧のコードを、オフコンの画面や帳票で1字ずつ見て、置き換える字を決める。
  3. Unicodeにある字はその字に、ない字は近い字か「〓」にして、置き換えた数を記録に残す。

合成したファイルでは、対応表に1字を載せ忘れたため、正しく読んでも154字が〓のまま残りました。〓の数を数えておけば、載せ忘れに気づけます。

変換したデータが正しいかは、どう確かめますか?

件数、合計金額、「数量×単価=金額」の行の数、外字の残りの4つを、オフコンの集計表と突き合わせます。Access引越しで1,200件の固定長ファイルを合成しました(架空のデータ、返品53件)。読み方を4通り誤ってみると、どの誤りも4つのどれかに表れました。

  • 符号Dを読み落とすと、件数は1,200件で合ったまま、合計金額が82,270,768円多くなりました。
  • レコード長を55バイトと1バイト誤ると、読めた行は22件で、1,156件が読めませんでした。
  • パック10進を文字として読むと、1,200件すべてが数字に戻りませんでした。
  • 外字の対応表を使わないと、件数と合計は合っても、598字が〓のまま残りました。
合成した1,200件を5通りの読み方で変換した検算の表。正しく読むと合計の差0、符号を無視すると+82,270,768円、レコード長を誤ると1,156行が読めず、対応表なしでは外字598字が残る読み方を誤ったとき、検算のどこで気づけるか(合成1,200件)元の件数 1,200件、元の合計金額 789,205,065円(うち返品 53件)と比べた結果読み方件数読めない行合計金額の差(円)外字の残り正しく読む1,20000154符号(D)を無視1,2000+82,270,768154レコード長を55と誤る221,156-773,763,5020パック10進を文字で読む01,200-789,205,065154外字の対応表なし1,20000598赤い数字が、元の件数・合計と合わない所。正しく読んでも外字が154字残るのは、対応表に1字が抜けていたため架空の合成データ(seed 20261016)。scripts/figs/offcon_extract.py で再現できる(計算値)
図3 読み方の誤りと検算の結果。架空の合成データの計算値です。赤い数字が元の値と合わない所です。

見落としやすいのは符号の誤りです。件数も行の形も正しく見えるので、合計金額を突き合わせないと気づけません。私は、合計をプラスの行とマイナスの行に分けて比べます。

合成したファイルは、文字の項目をcp932で書いた簡略版です。実機のJEFやEBCDIC系の文字の表とは違うため、実物では文字の変換をその機種の表に合わせます。スクリプトはscripts/figs/offcon_extract.pyで、同じ結果を再現できます。

このサイトで相談するには?

Access引越しでは、オフコンのデータの取り出しから、移した先で同じ帳票を出すところまでを一緒に進めます。何をどう頼むか決まっていなくても大丈夫で、準備は要りません。御社のやり方に合わせて、進め方を一緒に考えます。無料で相談する

よくある質問

オフコンの出力ツールでCSVにできれば、変換は要りませんか?
要らない場合もあります。ただし、ツールがパック10進の符号と外字をどう扱うかを確かめ、件数と合計金額で検算してから使います。
レイアウト表が見つからないと、データは取り出せませんか?
いいえ。COBOLのCOPY句やファイルの定義から作り直せることがあります。ファイルの大きさがレコード長で割り切れるかが、最初の手がかりです。
外字は、何字くらいあるものですか?
会社ごとに違います。JEFの外字の領域のマスは計算で3,102ありますが、使われているのは一部です。ファイルから数えて確かめます。
変換のプログラムは、自社で書けますか?
はい。レイアウト表がそろっていれば、Pythonの標準の機能だけで書けます。検算の4項目を集計表と突き合わせるところまで行ってください。

この数字の出し方

この記事の自前の数字は、次の見本・条件・回数で出しました。主宰が確かめ、更新日は2026年10月17日です。スクリプトの名前から、同じ手順を自分のファイルで再現できます。

  • Access引越しの実験(2026年10月16日、合成した固定長54バイト×1,200件。読み方を4通り誤って、件数と合計金額を比べた)。scripts/figs/offcon_extract.py

出典

  1. Impress クラウド Watch(2025年3月21日)の報道(2026年10月16日確認)
  2. IT Leaders「富士通、オフコンのモダナイゼーションサービスを体系化、オフコン運用支援は2030年度に終了」(2025年3月24日)(販売は2025年度、提供は2030年度=2031年3月末までで終了)(2026年10月16日確認)
  3. IBM Documentation「Sign representation of zoned and packed-decimal data」(COBOL for AIX 5.1)(2026年10月16日確認)
  4. IBM Documentation「Packed-Decimal Format」(IBM i 7.3)(2026年10月16日確認)
  5. 法務省「現行システムにおける外字運用」(登記情報システムのJEFコード体系、PDF 2003年8月作成)(2026年10月16日確認)
  6. Python 標準ライブラリ codecs(標準エンコーディング cp932)(2026年10月16日確認)