
以前こちらで質問したものです。
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も見ています
-
COBOLでの全角文字の判定をしたい。
その他(プログラミング・Web制作)
-
COBOLによる全角・半角混在→全角に
その他(プログラミング・Web制作)
-
COBOL、項目末尾に空白がある場合削除の方法その他
その他(プログラミング・Web制作)
-
-
4
COBOLの文法
その他(プログラミング・Web制作)
-
5
COBOLで半角カナを全角カナに変換
その他(プログラミング・Web制作)
-
6
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
7
COBOLで全角変換を行いたいのですが...
その他(プログラミング・Web制作)
-
8
EBCDIC⇒SJIS変換の方法
その他(プログラミング・Web制作)
-
9
COBOLでのNOT = の AND条件
その他(プログラミング・Web制作)
-
10
COBOLについて
その他(プログラミング・Web制作)
-
11
S9タイプからXタイプにデータは移行できるのか。(COBOL)
その他(プログラミング・Web制作)
-
12
COBOLの改行
その他(プログラミング・Web制作)
-
13
COBOL OCCURSで指定したデータの参照の仕方
その他(プログラミング・Web制作)
-
14
COBOLのS9タイプからXタイプへ変換する過程
その他(プログラミング・Web制作)
-
15
SOK EOK
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
プログラミングを学べる!?進化している子どものおもちゃについて専門家に聞いた!
プログラミングを学べるレゴブロックがあることはご存知だろうか。レゴに限らず最近のおもちゃには、プログラミングの要素がどんどん取り入れられているようだ。「教えて!goo」にも、「プログラミングを学べる子供...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
VBA 「,」・空白・カタカナ等...
-
検索の仕方を教えて下さい。
-
Excel2010以降でVBA変数名に全...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
VBで、String型のデータが、...
-
全角英数字の必要性が理解できない
-
COBOL・全角判定
-
Excel VBAでオートシェイプ内の...
-
プログラミングでは、半角括弧...
-
エクセルでの”々”の扱い
-
vba カタカナのみ全角にするに...
-
EXCELで、A01をA1と表記させ...
-
エクセルにMicrosoft Barcode C...
-
Excelの中に全角ひらがな、漢字...
-
エクセルで半角文字をシートご...
-
【ExcelVBA】英数記号の半角変換
-
COBOLを記述するとき
-
char型全角数字から、int型半角...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
IEからEdgeへの移行に伴うIMEの...
-
VBA 文字に半角が含まれて...
-
全角英数字の必要性が理解できない
-
word差し込み印刷 半角カタカ...
-
エクセルの検索が正しくできな...
-
メモ帳の段落の揃え方
-
エクセルにMicrosoft Barcode C...
-
COBOL・全角判定
-
エクセルでの”々”の扱い
-
プログラミングでは、半角括弧...
-
char型全角数字から、int型半角...
-
VB.net、テキストボックス入力...
-
全角/半角キーをSendkeys関数で...
-
明細書の英数字の全角・半角に...
-
ダブルコーテーションの置換
-
いまスマホからカードの申込み...
-
[Excel VBA] ODBCによる外部デ...
-
VBで、String型のデータが、...
おすすめ情報