過去の桐井戸端BBS (桐ver.8)
19236 ある文字数を超えた場合、それ以降を別の行に分割したい おぎの 2003/03/07-11:40
ある項目に文字数制限を付け、それを超える文字数のレコードのみ、
超える分以降を分割して、別レコードとしたいのですが、方法が分かりません。
分割したレコードは親・小番号などを付けて、直前のレコードと同じもの、
と分かるようにしたいのです。
また、この逆の方法も分かればぜひ教えて下さい。

逆とは、小番号が付いて複数行に分割されたデータを、親番号と同じ一行のレコード内に納めたいのです。
(これは結合と言う表現でしょうか?)
項目は別で構いません。小番号順に横に並べられれば、と思います。

桐のバージョンはVr.8 sp6です。(OS:Win98)
よろしくお願いします。
19237 Re:ある文字数を超えた場合、それ以降を別の行に分割したい うにん 2003/03/07-13:03
記事番号19236へのコメント
>ある項目に文字数制限を付け、それを超える文字数のレコードのみ、
>超える分以降を分割して、別レコードとしたいのですが、方法が分かりません。

とりあえず制限をつけずに入力した表があるのでしたら、

>分割したレコードは親・小番号などを付けて、直前のレコードと同じもの、と分か
>るようにしたいのです。

Re:項目の中身をわけたい-うにん(3/4-08:48)No.19178
で書いたのと全く同じ方法でできます。(分割方法が区切り文字","なのか文字数なのか、という違いだけです。
以下に出てくる数字の10は、制限する文字数です)

追加する項目の計算式が変わります。
項目名 計算式
分割数 #CEIL(#文字数([文字列])/10)

結合表定義もついでに小番号を付けるように少し変えます。
表示項目名 所属対象表 項目/計算式 抽出 絞り込み条件1
親番号 元の表.tbl 親番号 レ
文字列 (計算項目) #部分列(["元の表.tbl".文字列],(["renban.tbl".連番]-1)×10+1,10) レ
子番号 連番.tbl 連番 レ ["文字列分割.tbl".分割数]≧[]

>逆とは、小番号が付いて複数行に分割されたデータを、親番号と同じ一行のレコー
>ド内に納めたいのです。(これは結合と言う表現でしょうか?)
>項目は別で構いません。小番号順に横に並べられれば、と思います。

項目が別なら結合ですが、いくつに分割したかによって定義を変える必要が
出てくるので、むずかしいでしょう。
一つの項目に連結して戻すなら併合でできますが、分割した回数分
繰り返す必要があるので一括処理の出番となるでしょう。

分割したデータが必要なときだけ結合表で見ることにすれば、
元のデータはそのまま存在するので「逆」をする必要はありませんが。

19238 Re:ある文字数を超えた場合、それ以降を別の行に分割したい おぎの 2003/03/07-14:18
記事番号19237へのコメント
うにんさん、ありがとうございます。
さて、早速教えて頂いた通りやってみてはいるのですが、分からないところがあります。

>子番号 連番.tbl 連番 レ ["文字列分割.tbl".分割数]≧[]

上記の式に出てくる"文字列分割.tbl"という表は、項目名が[連番]だけの表とは別に、
もう一つ作るのでしょうか?

>分割したデータが必要なときだけ結合表で見ることにすれば、元のデータは
>そのまま存在するので「逆」をする必要はありませんが。

最終的には分割した状態の方がいいんです。つまり今回の最初の方の質問にある状態ですね。

ただ、修正の段階で文字列が抜けていたり、逆に削除したりして、文字制限通りに調節する必要がありますね。
追加して文字制限を越えたら、超えた分を次の行に文字列を移すなど、
これを手入力でやっていては大変なので、関数を使って処理するためには、
同一レコードに置けば良いんじゃないか、と思ったのです。

だから修正時には、いったん親番号ごとに1レコードにまとめておいて、
全ての修正が済んだ所で、また親番号、小番号とできないか、と思いました。

でも1項目にまとめるのならば可能なんですね?
そちらの方法も教えていただけないでしょうか?併合とは違いますか?
19239 Re:ある文字数を超えた場合、それ以降を別の行に分割したい うにん 2003/03/07-14:45
記事番号19238へのコメント
>上記の式に出てくる"文字列分割.tbl"という表は、項目名が[連番]だけの表とは別に、
>もう一つ作るのでしょうか?

それは、もとの表(分割する前のデータが入っている)の名前です。
わからなかったのでこっちで適当につけました。

>>分割したデータが必要なときだけ結合表で見ることにすれば、元のデータは
>>そのまま存在するので「逆」をする必要はありませんが。
>
>最終的には分割した状態の方がいいんです。つまり今回の最初の方の質問にある状態ですね。

分割した状態で何をしたいのかがいまいちわかりませんが、

>ただ、修正の段階で文字列が抜けていたり、逆に削除したりして、文字制限通りに調節する必要がありますね。

ですので、データベース上では分割しないでおいた方が便利だと思うのですが。
連続したままのデータを修正すれば、分割データは結合表を開きなおすだけで得られますので。

住所のような(分割位置が不定な)データは、県名・市名などに最初から分割しておいて
必要なときに連結する方が簡単ですが、今回の質問はそういうのとは違うようですし。
全体の長さにも制限をつけるなら、あらかじめ必要なだけの項目を作っておいて
入力・訂正は必ずフォームを使うようにすれば、イベントで再分割というのも可能と思いますが...

桐の仕様上文字列が4000文字までなので、2000文字ずつ分割して長文を入力したい、
とかいう要望なのかな???でもそれだと、最初から分割しないと入力できないし
項目を分けてもレコード長の制限にひっかかりますね。

つまり、「逆」をやろうとしても仕様上不可能というケースも考慮する必要ができてしまいますね。

19244 Re:ある文字数を超えた場合、それ以降を別の行に分割したい おぎの 2003/03/07-18:47
記事番号19239へのコメント
度々すみません。

>それは、もとの表(分割する前のデータが入っている)の名前です。
>わからなかったのでこっちで適当につけました。

>["文字列分割.tbl".分割数]≧[]
上記の式で指している元の表とは、
>文字列 (計算項目) #部分列(["元の表.tbl".文字列],(["renban.tbl".連番]-1)×10+1,10) レ
に出てくる"元の表.tbl"とは違いますか?

結合表を使ったことがないので、的はずれの質問でしたらスミマセン。
というより、tblしか使ったことが無いと言った方が早いです。

>分割した状態で何をしたいのかがいまいちわかりませんが、

今質問させていただいているのは仕事での入力なのですが、一番最後にはアクセスにデータを移したいんです。
それでアクセスだと半角255文字までしか入らないらしくて、桐で入力したデータを分割してから、テキストに書き出して、
アクセスに移す、のが最終目標です。(アクセス納品はクライアントの指定なのです)

>ですので、データベース上では分割しないでおいた方が便利だと思うのですが。

そうですね、ただ最初はできないのだと思っていて、入力時から分けてしまったのです。
でも次に入力する分は同一項目内に全て入力した方が修正し易いと思い直し、
こういう分割もできればと、こちらに質問してみました。

入力しているデータは古文書の目録のようなものです。
文書番号や年月日や文書名があり、本文があります。
今まではテキストでやっていたのですが、今回初めてアクセスを指定してきました。
私はアクセスで入力するよりは桐の方がいいだろうと思っています。
本文の文字数はそれほど無いんですが、さすがに半角255文字は超えてしまいます。

19245 Re:ある文字数毎に分割する一括処理例 悲しげ 2003/03/07-19:37
記事番号19244へのコメント
どもっ、おぎのさん
半角255文字ってことは、全角換算では127.5文字ですね。
で、全角半角混在のケースを考えるのはちと面倒なので、
ともかく入力文字列は全て全角であると仮定しちまって(^^;)、
全角127文字で制限をかけることにします。
で、項目としては、[文書番号]、[年月日]、[文書名]、[本文]があるとして、
一括処理で「印字」コマンドを使ってテキストへ書き出す方法を書いてみます。
表に書き出すよりも遥かに高速ですから。
------------------------------------------
変数宣言 ・・・(略)
表 "某元表.tbl",索引名="ほにょほにょ順"
書き出し 枠組み "某別表.tbl"
*ジャンプ 行番号=先頭
印字開始 "作業$$$.txt"
 繰り返し(.not #EOF)
  &文書番号=[文書番号],&日付=[年月日],&文書名=[文書名] \
  ,&本文=[本文],&残文=&本文
  *&本文、ってのは不要だったか。(^^;)
  繰り返し
   &文字数=#文字数(&残文)
   if(&文字数=<127)
    印字 &文書番号,"ξ",&日付,"ξ",&文書名,"ξ",&残文
    繰り返し中止
   else
    &分割文=#部分列(&残文,1,127),&残文=#部分列(&残文,128)
    印字 &文書番号,"ξ",&日付,"ξ",&文書名,"ξ",&分割文
   end
  繰り返し終了
  ジャンプ 行番号=+1
 繰り返し終了
印字終了
表 "某別表.tbl",索引名="ほにょほにょ順"
*条件(.not #空ファイル) 行削除 *,圧縮
読み込み テキスト,"作業$$$.txt",区切り="ξ",終了状態=&OK, \
    {[文書番号],[年月日],[文書名],[本文]}
ファイル削除 "作業$$$.txt"
表形式編集 ガイド="結果を確認して下さい"
------------------------------------------
区切り文字として"ξ"を使ったのは、データ中に有り難い文字との想定で。
タブ"09"を使えばいいのかもしれませんが、印字コマンドでコントロール文字の挙動が
環境設定の影響を受けるかもしれない(未確認)ので、
他人様向けの記述では避けてみたと云うことです。
あ、そもそも挙動未確認ですけど。(^^;)

19246 Re:ある文字数を超えた場合、それ以降を別の行に分割したい うにん@結合表推進委員会 2003/03/07-20:17
記事番号19244へのコメント
>>["文字列分割.tbl".分割数]≧[]
>上記の式で指している元の表とは、
>>文字列 (計算項目) #部分列(["元の表.tbl".文字列],(["renban.tbl".連番]-1)×10+1,10) レ
>に出てくる"元の表.tbl"とは違いますか?

あ、前回の投稿からコピーしたので直し忘れました(^^; 同じ表です。
データを入れてある表と、連番の入っている表と、それらを結合する結合表の3つです。

>>アクセスに移す、のが最終目標です。(アクセス納品はクライアントの指定なのです)

なるほど〜。
それならやっぱり、自分のところでは桐に入れておいて、納品時に結合表から
書き出し等でアクセスに持っていった方がよさそうです。

(アクセスにも長い文字列を入れるデータ型(メモ型だったかな?)があったと思いますが。)

複数レコードに分割した状態から連結するには、結合とか併合とか言いましたが、
計算式でやった方が簡単そうです。例えば
親番号 数値
子番号 数値
データ 文字列
連結値 文字列 #条件選択([親番号]=#直前値([親番号],0),#直前値([データ],""))+[データ]
という定義にしておいて、[親番号][子番号]順に整列した状態で[連結値]を再計算して、
行集計を[親番号]でグループ化して小計だけ取って集計行だけ表示にすればできるはず。
親番号 データ
#項目値 #項目値

19247 Re:ある文字数を超えた場合、それ以降を別の行に分割したい うにん@結合表推進委員会 2003/03/07-20:28
記事番号19246へのコメント
さっきのを書いているうちに悲しげさんから一括処理の投稿がありました。
今回は、最終目的がアクセスデータということなので、
直接テキストに落とすのは効率がいいかもしれませんね。

で、私は
>それならやっぱり、自分のところでは桐に入れておいて、納品時に結合表から
>書き出し等でアクセスに持っていった方がよさそうです。

といいましたが、考えてみればぴったりの文字数で分割したいという要望では
ないわけですよね?文字数(というか多分バイト数?)が255を超えるとまずい、
というだけなら、項目制約条件で文字数が超過しないようにして、入力時には
それよりも余裕を持った文字数で次のレコードにしてしまっておけば、
多少訂正が入っても問題ないような...

まあ、元々1つのデータをわざわざ分割しておく必要もないでしょうけど…

19250 Re:その逆 悲しげ 2003/03/07-22:43
記事番号19245へのコメント
あ、何だか「逆」の件もあったんですね。(^^;)
それなら、たまたまテキストに落としてあることだし、

 ファイル入力開始
  ファイル入力
 ファイル入力終了

で、ちょうど逆のことができたと思います。記述例は省略。

             /悲しげ@結合にがて人(;_;)

19274 Re:トライしてみます おぎの 2003/03/10-10:46
記事番号19246へのコメント
新たな方法まで教えて下さり、ありがとうございます。
早速やってみます。
この機会に結合表とか一括処理のやり方なんかも覚えたいですね。
まだ時間が掛かりそうなので、ご報告はのちほど。

戻る