2016-06-28 14 views
4

プログラムの入力である数字の大きな文字列があります(シーケンス名は 'S'と仮定しています)。文字列またはテーブルのどちらでもかまいませんカラム。 テーブル1のようなテーブルによって生成された入力文字列(S)。
「S」文字列を作成した未知のサブストリングを探したい。 各サブストリングは100個の数字で構成されています。文字列またはテーブルcoulmnで未知の繰り返し部分文字列を見つける方法

以下のように簡略化します。各サブストリングには、100個の数字の代わりに3個の数字が含まれています。

テーブル1enter image description here

表1の説明: 表1の各行は「S」スティングで繰り返さサブストリングのいずれかに属しています。 各列には、数字がランダムに繰り返された数字がその列に属する10個の数字があります。 例: 最初の列の場合は、4つの11と6の65または1の11と9の65などなどがあります。他の列はまったく同じです。そして、1つの番号を有する列については、10の繰り返しが、例えば列番号7の数は、以下のようになる:50 50 50 50 50 50 50 50 50 50。

出力は、 "S"文字列を作成したサブストリングを繰り返す。 出力:

11,10,13 
30,40,50 
65,66,61 

誰もが問題を解決するためpl_sqlまたはJavaで私を助けることができます。

+0

てみてくださいコード: http://stackoverflow.com/questions/10286677/how-to-check-for-repeating-sequence-in-an-integer –

+2

あなたはこの質問を明確にする必要があります。番号が属する行をFiで特定する方法あなたが強調表示した50の上と下の値が空であると判断する方法。できるだけ多くの情報を与えてください、これは十分にはっきりしていません –

答えて

0

ここで説明したように、私が基本的な問題を解決すると思ういくつかのPL/SQLがあります。私が思うより大きなデータセットに拡張されますが、数字をグループに分割することについていくつかの仮定をしなければなりませんでした。基本的なプロセスは、あなたが与えたデータ、記述、結果に対して機能します。この記事から

SET SERVEROUTPUT ON; 

DECLARE 
    TYPE numbers_t IS TABLE OF INT(2); 
    TYPE output_t IS TABLE OF VARCHAR2(100); 

    c_example VARCHAR2(160) := '1111111111111165656510101030306666666666134061134061616161611030303030306666666613131313134040404061505050505050505050506565656565656565656511111166666666666666'; 
    c_place INT := 1; 
    c_chunk INT := 1; 
    l_numbers numbers_t := numbers_t(); 
    l_output output_t := output_t(); 
    n binary_integer; 

BEGIN 
    l_output.EXTEND(3); 
    WHILE c_place <= LENGTH(c_example) 
    LOOP 
     l_numbers.EXTEND(10); 
     WHILE c_chunk <= 10 
     LOOP 
      l_numbers(c_chunk) := SUBSTR(c_example, c_place, 2); 
      c_place := c_place + 2; 
      c_chunk := c_chunk + 1; 
     END LOOP; 
     c_chunk := 1; 
     l_numbers := SET(l_numbers); 
     n := l_numbers.FIRST; 
     WHILE (n IS NOT NULL) 
     LOOP 
       CASE 
       WHEN l_numbers(n) < 30 THEN l_output(1) := l_output(1) || ',' || l_numbers(n); 
       WHEN l_numbers(n) > 50 THEN l_output(3) := l_output(3) || ',' || l_numbers(n); 
       ELSE l_output(2) := l_output(2) || ',' || l_numbers(n); 
      END CASE; 
      n := l_numbers.NEXT(n); 
     END LOOP; 
     l_numbers.DELETE(); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(1))); 
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(2))); 
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(3))); 
END; 
/
関連する問題