過去の桐井戸端BBS (桐ver.9)
24762 カンマで区切られた文字列をカンマとスラッシュで区切られた文字列に変換したい きじ 2004/02/11-23:44
いつも参考にさせて頂いてます。
行き詰まってしまいました、
ご教授お願いします。

A002,A129,A141,A150,A158,A162,A174,A178,A189,A196,A205
のような文字列があります。

これを
A002,A129/A141,A150/A158,A162/A174,A178/A189,A196/A205
の様にしたいのですがうまくいきません。

「/」はレポートの改行文字です。
文字列の長さは0から100で変動します。
レコードは4万件くらいあります。

桐ver9-2004です。よろしくお願いします。
24764 Re:文字列変換について 悲しげ 2004/02/12-01:05
記事番号24762へのコメント
どもっ、きじさん
例示からひとつの法則性を読みとるならば、
カンマ区切りの偶数番目の「,」を「/」に置き換えたいってことでしょうか?

とすれば、次のような一括処理で。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
変数宣言 固有,文字列{&STR0,&STR1,&STR2,&改},固有,長整数{&i}
&改="/"
表 "某.tbl"
表表示
確認 "やりますか?",&実行リターン
cond(&実行リターン=0) 終了
繰り返し(.not #EOF)
 &i=1,&STR0=[某項目],&STR1="",&STR2=""
 繰り返し
  &STR1=#対応文字列(&STR0,&i)
  条件(&STR1="") 繰り返し中止
  if(#mod(&i,2)=0)
   &STR2=&STR2+","+&STR1
  else
   &STR2=&STR2+&改+&STR1
  end
  &i=&i+1
 繰り返し終了
 if(&STR2<>"")
  &STR2=#sstr(&STR2,2) /*先頭の改行文字「/」を除去*/
  行訂正 [某項目]=&STR2
 end
 ジャンプ 行番号=+1
繰り返し終了
確認
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

24765 もう少し詳しくお知らせ下さい 佐田 守弘 2004/02/12-01:26
記事番号24762へのコメント
きじさん
まず先に結論めいた事を申しますと、桐のメニューやコマンドにある通常の機能だけでは、
目的の文字列変換を行う事はできないと思います。
しかし一括処理を使って、力技で処理すれば、多分可能でしょう。

その一括処理は、面倒ではありますが、行数はそれ程多くはないと思います。
しかしその前に、不明点があるので、この部分を先に確認させて下さい。
これらが解らないと、どの様に処理したらよいかを考えようがありません。

●文字列置換のより詳細なルール
 >A002,A129/A141,A150/A158,A162/A174,A178/A189,A196/A205
 >の様にしたいのですがうまくいきません。
と書かれていますが、「の様に」がどの様にであるか良く解りません。
表示されているサンプルから推測するに、次のどちらかとは思うのですが。
@奇数番目のコンマはそのままにし、偶数番目のコンマをスラッシュに変える
A10番目、20番目と10の倍数番目の文字をスラッシュに変えればよい。
  (区切られている「A002」などは4文字に固定されている。)
どちらのルールでも可能ですが、Aの方が処理速度が速くなります。

●文字列の長さという意味
 >文字列の長さは0から100で変動します。
ここで言う文字列の長さとは、1項目の文字列の長さの事ですか?
それとも、例として書いている「A002」などが実際には0〜100文字の間で
変動すると言う意味ですか?

●置換する文字についての疑問
コンマは、データ区切りのために使う他に、位取りにも使う記号です。
区切りとしてのコンマ以外に、位取りのコンマがあって、これは対象から
除外する必要がある等の例外ルールはないと考えてよいですね。

また、半角スラッシュを強制改行文字に使おうとしている様ですが、半角スラッシュも文字データの中で良く使う文字です。
このデータは、スラッシュを強制改行文字として使っても構わないのですか?

佐田守弘(KS-00119)
24769 Re:文字列変換について きじ 2004/02/12-02:32
記事番号24764へのコメント
悲しげさん、こんばんは
先ほど、教えて頂いた一括処理を試させて頂きました。
望み通りの処理が行えました。
ありがとうございました、今後ともよろしくお願いします。きじ

24770 Re:もう少し詳しくお知らせ下さい きじ 2004/02/12-02:48
記事番号24765へのコメント
佐田さんこんばんは
問題自体は悲しげさんの方法で解決しましたが
ご教授お願いします。

質問が舌足らずで申し訳ありませんでした。

>●文字列置換のより詳細なルール
> >A002,A129/A141,A150/A158,A162/A174,A178/A189,A196/A205
> >の様にしたいのですがうまくいきません。
>と書かれていますが、「の様に」がどの様にであるか良く解りません。
>表示されているサンプルから推測するに、次のどちらかとは思うのですが。
>@奇数番目のコンマはそのままにし、偶数番目のコンマをスラッシュに変える
>A10番目、20番目と10の倍数番目の文字をスラッシュに変えればよい。
>  (区切られている「A002」などは4文字に固定されている。)
>どちらのルールでも可能ですが、Aの方が処理速度が速くなります。

処理は1の方です。

>●文字列の長さという意味
> >文字列の長さは0から100で変動します。
>ここで言う文字列の長さとは、1項目の文字列の長さの事ですか?
>それとも、例として書いている「A002」などが実際には0〜100文字の間で
>変動すると言う意味ですか?

「A002」4桁固定1セットでコンマ区切りで並んでいますがそのセット数は不規則です

>●置換する文字についての疑問
>コンマは、データ区切りのために使う他に、位取りにも使う記号です。
>区切りとしてのコンマ以外に、位取りのコンマがあって、これは対象から
>除外する必要がある等の例外ルールはないと考えてよいですね。

例外はありません

>また、半角スラッシュを強制改行文字に使おうとしている様ですが、半角
>スラッシュも文字データの中で良く使う文字です。
>このデータは、スラッシュを強制改行文字として使っても構わないのですか?

問題ありません

以上、よろしくお願いします。きじ
24797 Re:もう少し詳しくお知らせ下さい 佐田 守弘 2004/02/12-22:20
記事番号24770へのコメント
きじさん
●処理のアルゴリズム
 >処理は1の方です。
と書かれていますが、
 >「A002」4桁固定1セットでコンマ区切りで並んでいますが
との事なので、前回書いたAの処理、つまり10×n桁目をスラッシュに
書き換える処理で行えます。
仮に表は、データ.tbl、項目名は[文字]と仮定します。
(動作テストは行っておりません)

●一括処理
変数宣言 整数{&文字長,&位置}
表 データ
繰り返し (.not #終端行)
 代入 &文字長=#文字数([文字])
 繰り返し &位置=10,&文字長,10
  行訂正 [文字]=#部分列([文字],1,&位置-1) \
         +"/" \
         +#部分列([文字],&位置+1)
 繰り返し終了
 ジャンプ 行番号=+1
繰り返し終了
終了 表

なお、4桁文字のセットが1セットないし全くないときの事は考慮しておりません。
多分大丈夫だと思いますが、もしだめなら、2つ目の繰り返しと行訂正の間に、
 条件 (&文字長<10) 繰り返し中止
を入れてみて下さい。

佐田守弘(KS-00119)
24803 Re:もう少し詳しくお知らせ下さい きじ 2004/02/12-23:26
記事番号24797へのコメント
佐田こんばんは
早速試してみました、全く問題なく置換しました
大変参考になりました、ありがとうございました。きじ

戻る