以前こちらで質問したものです。
http://oshiete1.goo.ne.jp/qa2553484.html
例題を参考に詳細設計書を作成中ですが、
お客様の要望で「漢字項目は前後に漢字制御コード(前に‘0A42’後に‘0A41’)を付加する」というのがあり、わからなくなってしまい質問です。
漢字項目もX(40)というようにCOPY句で設定されています。
どの項目が漢字項目なのかは資料をいただいてわかっています。
例題をもとにすると
IF DATA-AREA NOT = ' '
PERFORM TEST BEFORE VARYING I FROM DATA-LEN BY -1
UNTIL (I < 1) OR (DATA-AREA(I:1) NOT = ' ')
CONTINUE
END-PERFORM
【1】
MOVE I TO DATA-LEN
STRING DATA-AREA ','
DELIMITED SIZE
INTO OUT-REC
WITH POINTER DATA-POS
END-STRING
【1】にIF文でデータが全角かどうか判定するのだと思うのですが
どう判定したらよいのでしょうか。マニュアルをみたのですが探せませんでした。またもし全角データだった場合STRINGはどのように記入すればよいのでしょうか。
No.5ベストアンサー
- 回答日時:
#3、#4回答者です。
少し勘違いしていたかも知れません。
X(40)の項目に、漢字データがX'0A42'、X'0A41'抜きで入っているのですか?
もしそうなら、「後方の半角スペース取り除く」とのことでしたが、データの終端は分かるのでしょうか?この場合は、「全角のスペースを取り除く」ということになるのでしょうか?
データの中身を見て、全角のコードか否かを判断するのは容易ではなく、またチェックのためのオーバヘッドが発生します。全角データか否かをフラグで引き継ぐ方が、簡単な処理にできると思います。
77 KANJI-FLG PIC S9(1) COMP.
77 KI PIC X(2) VALUE X'0A42'.
77 KO PIC X(2) VALUE X'0A41'.
~中略~
*
MOVE 1 TO KANJI-FLG.
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM1).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM1).
PERFORM DATA-EXTRACT.
*
MOVE 0 TO KANJI-FLG.
COMPUTE DATA-PTR = FUNCTION ADDR(ITEM2).
COMPUTE DATA-LEN = FUNCTION LENGTH(ITEM2).
PERFORM DATA-EXTRACT.
*
~中略~
* 以下の後方の半角スペースを取り除く処理で、
* 全角データの場合、X'0A42'、X'0A41'が入ってないなら、
* 終端は分かる???
IF DATA-AREA NOT = ' '
PERFORM TEST BEFORE VARYING I FROM DATA-LEN BY -1
UNTIL (I < 1) OR (DATA-AREA(I:1) NOT = ' ')
CONTINUE
END-PERFORM
MOVE I TO DATA-LEN
IF KANJI-FLG = 0
STRING DATA-AREA ','
DELIMITED SIZE
INTO OUT-REC
WITH POINTER DATA-POS
END-STRING
ELSE
STRING KI DATA-AREA KO ','
DELIMITED SIZE
INTO OUT-REC
WITH POINTER DATA-POS
END-STRING
この回答への補足
回答ありがとうございます。
その通りです。
入力データではX'0A42'、X'0A41'抜きで入っているので、CSVファイルを作成する時に付加してほしいという要望です。
全角空白、データ途中の半角空白は削除しないとの事ですが、終端がわかるかどうかはちょっと不明です。担当者様に質問してみます。またわかりましたら補足にて報告します。
No.4
- 回答日時:
#3回答者です。
分かりにくい部分があったので、追記します。
【変更前】
STRING命令でも、半角だとか全角だとか意識せず、半角データとしてCSVデータを作ってしまえばいいと思いますが?
【変更後】
STRING命令でも、半角だとか全角だとか意識せず、半角データとしてX'0A42'とX'0A41'も含めてCSVデータを作ってしまえばいいと思いますが?
この回答への補足
お客様から回答があり
ひとつのフィールド内に、漢字と英字は混在しないことになっているので、
「フィールドの末尾から当該位置の文字コードが 0x40 でない間ループする」というチェックを行い、データの切り出し位置を求めればいいはずです。
との事でした。
ですので、#5のような構文でいいのでしょうか。
No.3
- 回答日時:
前回の質問で、コーディング例を提示したものです。
全角か半角かを判定しなければならない理由は、何でしょうか?
PERFORMでデータの後方からループさせ、後方の半角スペースは除く処理にしています。もし全角データがあれば、今回はX'0A42'+データ+X'0A41'とのことですので、ループはX'0A41'のX'41'を検知した時点で停止します。
STRING命令でも、半角だとか全角だとか意識せず、半角データとしてCSVデータを作ってしまえばいいと思いますが?
「X'0A42'+データ+X'0A41'」を、変なところで改行したりしなければ、文字化けすることもありません。
ちなみに、半角スペースはX'40'、全角スペースはX'4040'またはX'A1A1'という文字コードです。全角は必ず「X'0A42'+データ+X'0A41'」となっているなら、後方から半角スペース(X'40')を探して取り除くという処理で問題ないと思います。
今回は不要と感じますがSTRING等で、1バイト単位でなく全角単位で操作する場合は、コンパイラオプションで指定可能だったと思います。
No.2
- 回答日時:
私は、FORTRANのエンジニア/研究者でCOBOLは#1の方より触ってない(COBOL74まで)のでちょっと自信ないですが
汎用機の場合、COBOLでも癖があるので、出来ればターゲットホストとOSを書いた方がいいですよ。
で、KI/KOが0A42h/0A41hということからしてHITAC VOS1/3あたりですよね。
EBCDIK(日立だからね)の場合、漢字はJIS+8080hで表現され、KI/KOが無いと、EBCDIKではANKと漢字は同じコードが被るので区別できません。
お客様の要求がファイル出力時にKI/KOをつけてくれというのか、入力設計段階でKI/KOがついているというのかがわからないのですが、少なくとも、内部の漢字領域は+4とっておけばいいと思います(大概は有効長が4短くなる場合が多いけど)。
そのフィールドがANK/漢字混在でかつフォーマット不定の場合、KI/KOが複数になるので、プリプロセスで何らかの処理をしないと無理でしょう。極端な話、一1二2三3四4なんてのが来ると、これだけで、28バイト(KI一KO1KI二KO2KI三KO3KI四KO4となるので)になってしまいます。ファイル設計者がホストを知っていれば、おそらくは2バイトコード固定フィールドだと思いますが、PCしか知らないと酷い目にあいますのでご注意。
No.1
- 回答日時:
COBOLは20年以上触ってないのでわからないですが(^_^;)
これは、JIS句点漢字を使っているということですか?
そのX(40)の中に含まれている文字は『すべて漢字』ということでよいのでしょうか?
もしそれならば、DATA-LENが36以上ならエラー(shift-in/outで4バイト使うから)
36文字以下だったら、
DATA-LEN+4に0x41, DATA-LEN+3に0x0A, DATA-LEN~1バイト目のデータを DATA-LEN+2~3バイト目に2バイトずつずらす
1に0x0A,2に0x42を入れる
とすることでOK
もし、句点JIS漢字で「あいうABCえお」のようになっているのだとしたら、シフトイン・シフトアウトを後からつけるのは無理です。
漢字じゃない部分と区別がつかないので。
そうではなくて、Shift_Jis等の漢字コードを使っているが、漢字としての扱い部分の前後に、シフトインアウトをつけたいということなら、
「あいうABCえお」は、「(shift-in)あいう(shift-out)ABC(shift-in)えお(shift-out)」となるので、
単純に前後に入れるだけではだめで、漢字コード表を意識したつくりにする必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
COBOLでの全角文字の判定をしたい。
その他(プログラミング・Web制作)
-
COBOL、項目末尾に空白がある場合削除の方法その他
その他(プログラミング・Web制作)
-
COBOLによる全角・半角混在→全角に
その他(プログラミング・Web制作)
-
-
4
COBOLの改行
その他(プログラミング・Web制作)
-
5
COBOLで半角カナを全角カナに変換
その他(プログラミング・Web制作)
-
6
EBCDIC⇒SJIS変換の方法
その他(プログラミング・Web制作)
-
7
COBOLでのNOT = の AND条件
その他(プログラミング・Web制作)
-
8
COBOLの文法
その他(プログラミング・Web制作)
-
9
COBOLのMOVEで桁数が異なる場合
その他(プログラミング・Web制作)
-
10
COBOL FILLER
その他(プログラミング・Web制作)
-
11
COBOLで全角変換を行いたいのですが...
その他(プログラミング・Web制作)
-
12
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
13
【COBOL】文字列から数値項目に転記するにあたって
その他(プログラミング・Web制作)
-
14
SOK EOK
その他(Microsoft Office)
-
15
COBOLで、文字タイプのフィールドを文字コードで指定したい。
その他(プログラミング・Web制作)
-
16
全角スペースを削除するには?
Visual Basic(VBA)
-
17
COBOLについて
その他(プログラミング・Web制作)
-
18
COBOL等でのHIGH_VALUEについて
IT・エンジニアリング
-
19
COBOLのCOMP形式について
その他(プログラミング・Web制作)
-
20
COBOL OCCURSで指定したデータの参照の仕方
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
char型全角数字から、int型半角...
-
エクセルにMicrosoft Barcode C...
-
word差し込み印刷 半角カタカ...
-
メモ帳の段落の揃え方
-
C言語のコンパイルエラーなん...
-
COBOL・全角判定
-
IEからEdgeへの移行に伴うIMEの...
-
封筒の宛先で縦書きの書き方
-
.NET3.5におけるキーボードの「...
-
エクセルの検索が正しくできな...
-
VBでのカナの自動入力方法について
-
Excelの中に全角ひらがな、漢字...
-
Pythonにおける全角括弧の正規表現
-
全角英数字の必要性が理解できない
-
COBOLで全角変換を行いた...
-
いまスマホからカードの申込み...
-
全角スペースを削除するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
VBA 文字に半角が含まれて...
-
COBOL・全角判定
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
IEからEdgeへの移行に伴うIMEの...
-
word差し込み印刷 半角カタカ...
-
全角英数字の必要性が理解できない
-
封筒の宛先で縦書きの書き方
-
メモ帳の段落の揃え方
-
エクセルの検索が正しくできな...
-
VB.net、テキストボックス入力...
-
ダブルコーテーションの置換
-
CString Format にて全角空白文...
-
.NET3.5におけるキーボードの「...
-
エクセルでの”々”の扱い
-
VBで、String型のデータが、...
-
「一角」って何でしょうか
-
コマンドプロンプト 全角を含ん...
おすすめ情報