• ベストアンサー

COBOLで半角カナを全角カナに変換

COBOLの初心者です。半角カナを全角カナに変換するルーチンを作成するように言われて困っています。ヒントとなるようなサンプルソースを教えて頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#258293
noname#258293
回答No.5

REDEFINES がちゃんと理解できていないのでしょうか。 たとえば、こんな定義をしたとします。 01 TEMP.   05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.   05 TEMP-TEXTR REDEFINES TEMP-TEXT.    07 TEMP-1 PIC X(02).    07 TEMP-2 PIC X(02).    07 TEMP-3 PIC X(02).    07 TEMP-4 PIC X(02).    07 TEMP-5 PIC X(02). 05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'. ではメモリ上の各アドレスに次のようにデータが入ります。 アドレス  文字 ADDR0001| A ADDR0002| B ADDR0003| C ADDR0004| D ADDR0005| E ADDR0006| F ADDR0007| G ADDR0008| H ADDR0009| I ADDR0010| J 05 TEMP-TEXTR REDEFINES TEMP-TEXT. は メモリのADDR1からどのように項目に 割り当てるかが指定されます。 この例だと TEMP-1 から 順に2文字ずつなので TEMP-1には ADDR0001| A ADDR0002| B TEMP-2には ADDR0003| C ADDR0004| D TEMP-3には ADDR0005| E ADDR0006| F TEMP-4には ADDR0007| G ADDR0008| H TEMP-5には ADDR0009| I ADDR0010| J 割り当てられます。

mn777naga
質問者

補足

すいません。REDEFINESはわかっていませんでした。ようやく理解できました。 ようやく、検索の処理にたどりついたのですが、WK-BBBBの半角の入力されたエリアを、WK-AAAA出力エリアに全角カナで出力しようと思い以下の処理を書いたのですが、無限ループに入ってしまいました。 以下の比較処理は、どこがわるいんでしょうか。     DATA DIVISION.     WORKING-STORAGE SECTION.     01 A-RECORD-ALT.     05 FILLER PIC X(03) VALUE "アア".     05 FILLER PIC X(03) VALUE "イイ".     05 FILLER PIC X(03) VALUE "ウウ".     05 FILLER PIC X(03) VALUE "ウウ".     01 WK-TBL-MASTER REDEFINES A-RECORD-ALT.       03 WK-TBL-TABLE OCCURS 2     INDEXED BY TBL-IDX.     05 WK-TBL-CODE PIC X(01).     05 WK-TBL-STR-CODE PIC X(02).    01 WK-AAAA PIC X(10). 01 WK-BBBB PIC X(05). 01 I PIC 9(02). 01 X PIC 9(02). 03 WK-TBL-TABLE OCCURS 2     INDEXED BY TBL-IDX.     05 WK-TBL-CODE PIC X(01).     05 WK-TBL-STR-CODE PIC X(02).     01 WK-AAAA PIC X(10). 01 WK-BBBB PIC X(05). 01 I PIC 9(02). 01 X PIC 9(02). MOVE "イウアイウ" TO WK-BBBB MOVE 1 TO I MOVE 1 TO X PERFORM UNTIL I > 5 SET TBL-IDX TO 1 DISPLAY WK-BBBB(I:1)     SEARCH WK-TBL-TABLE VARYING TBL-IDX AT END MOVE SPACE TO WK-AAAA CONTINUE ; WHEN WK-TBL-CODE(TBL-IDX)=WK-BBBB(I:1) DISPLAY WK-TBL-CODE(TBL-IDX) DISPLAY WK-BBBB(I:1) MOVE WK-TBL-STR-CODE(TBL-IDX) TO WK-AAAA(X:1) ADD 1 TO I DISPLAY I ADD 2 TO X DISPLAY WK-TBL-STR-CODE(TBL-IDX) DISPLAY WK-AAAA(X:2) SET TBL-IDX UP BY 1; END-SEARCH END-PERFORM.      STOP RUN.

その他の回答 (6)

noname#258293
noname#258293
回答No.7

補足です。 一通り動くようになったら、カタカナ以外の文字を変換処理に入れたらどうなるかも確認してください。

mn777naga
質問者

補足

大変親切にありがとうございました。テーブルの定義に誤りがありました。解決致しました。 ありがとうございました。

noname#258293
noname#258293
回答No.6

DISPLAY を随所に入れているのはいいことです。せっかくDISPLAYしているのですからその結果を活用しましょう。 DISPLAYされた内容から処理がどこを流れているか確認できるはずです。 自分が思っているとおりに流れていないところがあったら、何故そこに流れたのかを考えてください。 いただいたソースには複数の問題がありますが、WK-TBL-MASTER をDISPLAY してみると何かに気づくはずです。

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

Shift JISでしたら、エスケープシーケンスが無いので、対象の1byteとその前後の1byteをチェックすれば、必ず何の文字か判断できますね。 http://ja.wikipedia.org/wiki/Shift_JIS どのコードをどのコードに変換するかは下記の表を見れば分かると思います。 半角カナを含む文字コード表 http://ash.jp/code/codetbl1.htm 全角カナを含む文字コード表 http://ash.jp/code/codetbl2.htm 詳しくは参考URLのページなどを見ると良いかと。

参考URL:
http://euc.jp/i18n/charcode.ja.html
回答No.3

>03 WK-TBL-TABLE OCCURS 0 TO 2 > DEPENDING ON TBL-SIZE 本題からそれますが、0~2の可変長って、何をやりたいのでしょう? >テーブルに初期値を VALUE句で定義 VALUE句で初期値を入れた領域を、このテーブルではREDEFINEで参照する形にすればいいと思います。

mn777naga
質問者

補足

すいません。本当に初心者で、例えば、 001110 01 WK-TBL-MASTER. 001120 03 WK-TBL-SIZE PIC 9(02). 001130 03 WK-TBL-TABLE OCCURS 3 001140 DEPENDING ON WK-TBL-SIZE 001150 INDEXED BY TBL-IDX. 001160 05 WK-TBL-CODE PIC X(01). 001170 05 WK-TBL-STR-CODE PIC N(02). 上記の定義して、とりあえず、半角カナ "ア イ ウ"を全角カナの"ア イ ウ"に変換するためのテーブルを定義したいです。 例: 半角アの WK-TBL-CODE(1) 全角の"ア"、WK-TBL-STR-CODE(1)の文字といったように定義したテーブル準備したいです。 SEARCHを使って、実際の半角カナを全角カナに変換しようとしています。 本当に初心者で、説明を不足していて申し訳ありません。 REDEFINEは項目の再定義と知っているんですが、VALUE句で定義した初期値、上記の2次元表にどうわりあてていいかわかりません。 すいません。宜しくお願いします。

noname#258293
noname#258293
回答No.2

>内部に変換テーブルをもって力技で変換しろと言われています というのがヒントですね。 計算で求める必要はないということです。 とっても簡単なのでご自分で考えてみましょう。 カタカナは全部で何文字ですか。 OCCURS はご存じですか?

mn777naga
質問者

補足

本当に初心者ですいません。 01 WK-TBL-MASTER. 03 WK-TBL-SIZE PIC 9(02). 03 WK-TBL-TABLE OCCURS 0 TO 2 DEPENDING ON TBL-SIZE INDEXED BY TBL-IDX. 05 WK-TBL-CODE PIC X(01). 05 WK-TBL-STR-CODE PIC X(02). いろいろ調べながら以下のような検索テーブルを作成しました。 WK-TBL-CODEには、半角の文字を。WK-TBL-STR-CODEには、変換後の全角文字を初期値として定義し、検索用テーブルを作成しようとしています。上記のテーブルに初期値を VALUE句で定義するためには、どうすればいいんでしょうか。

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

対象の文字エンコーディングが何なのかを書かなければ、回答が付かないと思いますよ。 もし文字エンコーディングが分からなければ、OSや機種などの環境を書かれると良いかと。(Windows/ACOS/FACOMなど) 特にUNIX・Windows系と汎用機系では、一般的に使われる文字エンコード方式が全く違いますので処理も異なります。

mn777naga
質問者

補足

すいません。OSはLinuxです。文字は、文字エンコーディングS-JISデータです。内部に変換テーブルをもって力技で変換しろと言われています。大変申し訳ございませんが宜しくお願い致します。

関連するQ&A

  • 半角カナを全角カナに変換したい

    表題の通りです。 先輩から引き継いだエクセルのデータが、全角カナと半角カナとの両方を、使い分けなどではなく使用しているものだったので、半角カナを全部、全角カナに変換したいと考えています。 置換機能で50音全部を置換するのは大変ですので、一度に変換する良い方法があれば教えてください。 また、全角アルファベットを、普通の英字(半角アルファベット?)にも変換したいと思っています。

  • COBOLによる全角・半角混在→全角に

    いつもお世話になっております。 COBOLで全角、半角が混在したデータを全角だけに変換したいのですが、 何か良い方法はありませんでしょうか? 宜しくお願い致します。

  • 全角カナを半角カナへ

    お聞きしたいのですが 全角カナを半角カナに変換したいのですが、どのような関数もしくはやり方(ロジック)があるでしょうか? ちなみにPHP4ではなくPHP3です。 すみませんが、宜しくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • Excelで半角カナのみを全角に変換したい

    EXCELで、半角カナのみを全角に変換する方法はありますか? JISという関数がありますが、これは英数まで全角に変換されてしまいます。

  • COBOLで全角変換を行いたいのですが...

    汎用機(ACOS-4)でCOBOLを使って開発を行っている者です。 INファイルのある項目を全角変換し、 OUTファイルに出力するプログラムを作成しています。 ただ困った事に変換元の項目の内容が 半角のデータ、全角のデータ、半角全角が混在しているデータもあるのです。 現在は項目の中に半角スペースの文字コードが存在すれば全て半角とし、 以外は全て全角と判断しています。 もちろん項目中のデータが全て埋まっている場合や、 半角全角が混在しているデータについては文字化けを起こしています。 どなたかこのような変換について良い方法があればご教授願います。 宜しくお願い致します。

  • 半角カナを全角カナに変換する方法?

    言語:Perl5 環境:Unix 半角カナで入力された場合に全角カナへ変換する方法を教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Ruby言語にて、全角カナ⇔半角カナ変換がうまくいかずで困っております

    Ruby言語にて、全角カナ⇔半角カナ変換がうまくいかずで困っております。 以下のようにプログラミングをしてます。 結果が、思った通りではないのですが、何が原因でしょうか。 ※★→←★部分で囲んだ部分は半角文字です(ブラウザ上、半角文字が全角に変換されているようなので、  適宜そのような表記を入れました。 ●半角→全角変換 sss = "★→アイウエオ←★".tr('★→ア-ン←★', 'ア-ン') p sss ⇒★→アウオキケ←★ ●全角→半角 sss = "アイウエオ".tr('ア-ン', '★→ア-ン←★') p sss ⇒ア★→イ←★イ★→ウ←★ウ どうか原因を教えてください。

    • ベストアンサー
    • Ruby
  • 列ごとに全角英数・全角カナ・半角カナしか入力できないフォーマットをつくりたい

    エクセルで基本フォーマットを作り、他の人に配布&入力してもらった後、全てを集計&データベース化する必要があるのですが。 各列に設けた項目により、‘全角英数のみ’‘全角カナのみ’‘半角カナのみ’の入力規則を設けた後、ロックをかけてみたのですが、変換できてしまう…? 全角英数&カナに関しては【=LEN()*2=LENB()】で逃げれたように思うのですが、‘半角カナのみ’の入力設定がわかりません…;; ちなみに、別の列に入力したものを数式で半角に変換する方法は、今回のフォーマットには使いたくないのですが…?? どなたか、お助けください…**

  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 半角・全角文字が入り乱れて、困っています。

    すみません。どなたか教えてください。 windows 98 を使っています。 wordやexel を使って、文字を入力したとき無意識のうちに (英・数・カナ)の半角と全角がどうしても入り混じってしまって、 結果的にかなり見てくれが悪くなってしまいます。 (他の人が作成した書類を見ても、ほとんど同じことが起きています。) 1.全体に半角と全角が入り混じらないように、最初から英・数の全角とカナの 半角文字が入力できないような初期設定はできないのでしょうか? 2.確定させた後、半角・全角を一括で (英数→半角、カナ→全角に)変換 できないでしょうか?   Macを使っていたときはこんな無意味な苦労をしたことがなかったのですが・・・

専門家に質問してみよう