![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
以前こちらで質問したものです。
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も見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
何回やってもうまくいかないことは?
みなさんには、何回やってもうまくいかないことはありますか?
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
一番好きなみそ汁の具材は?
みんなで大好きなみそ汁の具材について語り合おうよっ!
-
COBOLでの全角文字の判定をしたい。
その他(プログラミング・Web制作)
-
COBOLによる全角・半角混在→全角に
その他(プログラミング・Web制作)
-
COBOL、項目末尾に空白がある場合削除の方法その他
その他(プログラミング・Web制作)
-
-
4
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
5
COBOLの文法
その他(プログラミング・Web制作)
-
6
COBOLの改行
その他(プログラミング・Web制作)
-
7
COBOLで半角カナを全角カナに変換
その他(プログラミング・Web制作)
-
8
COBOLについて
その他(プログラミング・Web制作)
-
9
COBOLで全角変換を行いたいのですが...
その他(プログラミング・Web制作)
-
10
EBCDIC⇒SJIS変換の方法
その他(プログラミング・Web制作)
-
11
COBOL OCCURSで指定したデータの参照の仕方
その他(プログラミング・Web制作)
-
12
COBOL FILLER
その他(プログラミング・Web制作)
-
13
COBOLのMOVEで桁数が異なる場合
その他(プログラミング・Web制作)
-
14
COBOLで、文字タイプのフィールドを文字コードで指定したい。
その他(プログラミング・Web制作)
-
15
全角スペースを削除するには?
Visual Basic(VBA)
-
16
【COBOL】文字列から数値項目に転記するにあたって
その他(プログラミング・Web制作)
-
17
SOK EOK
その他(Microsoft Office)
-
18
COBOLでのNOT = の AND条件
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
エクセルでの”々”の扱い
-
エクセルの検索が正しくできな...
-
半角/全角文字混在データの分...
-
UWSC教えて
-
IEからEdgeへの移行に伴うIMEの...
-
プログラミングでは、半角括弧...
-
VBAでシングルクオート(8217)を...
-
メモ帳の段落の揃え方
-
コンボボックスに貼り付け文字...
-
全角英数字の必要性が理解できない
-
Accessで日付や数値を全角で表...
-
COBOL・全角判定
-
Word2007の全角文字、全角スペ...
-
明細書の英数字の全角・半角に...
-
char型全角数字から、int型半角...
-
perl 初めてのプログラムにエラ...
-
.NET3.5におけるキーボードの「...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
LaTeXで半角カンマと全角カンマ...
-
エクセルにMicrosoft Barcode C...
-
VBA 文字に半角が含まれて...
-
プログラミングでは、半角括弧...
-
エクセルでの”々”の扱い
-
COBOL・全角判定
-
word差し込み印刷 半角カタカ...
-
メモ帳の段落の揃え方
-
char型全角数字から、int型半角...
-
全角入力
-
いまスマホからカードの申込み...
-
VB.net、テキストボックス入力...
-
Accessのテキストボックスの入...
-
正規表現で、全角文字を半角文...
-
明細書の英数字の全角・半角に...
-
ダブルコーテーションの置換
おすすめ情報