0

次のようなデータを含むテキストファイルがあります。

A 123 JoeBSD1639973e7378790
A 344 TomGDF7393694e0902087
B 344 ZenGDF9838987e0849399

sqlldrを使用して一時テーブルに一括挿入しましたが、ここにはフィールド区切り文字がないため、すべてのデータが1つの列にあります。

次に、このデータを次のように列に分離します。

Section    Book1   Name   Book2   RollNo   Book3   RegNo
----------------------------------------------------------
A          123     Joe    BSD     1639973  e       7378790
A          344     Tom    GDF     7393694  e       0902087
B          344     Zen    GDF     9838987  e       0849399

フィールドを識別する方法は、Sectionが2の長さ、Book1が4、Nameが3、Book2が3、RollNoが7、Book3が1、RegNoが7のようなcharの長さを使用することです。

誰かがこの変換を行うためのクエリを手伝ってくれますか?

4

5 に答える 5

1

SubStr()関数が必要です:http ://docs.oracle.com/cd/B19306_01/server.102/b14200/functions162​​.htm

SQLローダーを一時テーブルに挿入する代わりに外部テーブルを使用することを検討してください。SQL関数をファイルデータに適用し、ファイルの読み取り中に列を分割する方が簡単です。

于 2013-03-13T12:19:24.627 に答える
1

あなたはsubstrを使うことができます

例えば:

with data as (select 'A 123 JoeBSD1639973e7378790' str from dual union all
select 'A 344 TomGDF7393694e0902087' from dual union all
select 'B 344 ZenGDF9838987e0849399' from dual)
select str,
       substr(str, 1, 1) section,
       substr(str, 3, 3) book1,
       substr(str, 7, 3) name,
       substr(str, 10, 3) book2,
       substr(str, 13, 7) rollno,
       substr(str, 20, 1) book3,
       substr(str, 21, 7) regno
  from data;
于 2013-03-13T12:20:29.900 に答える
1

UTLファイルを使用してフラットファイルからデータを抽出することもできます。UTLファイルはデータを文字列自体としてSUBSTR抽出するため、正しい列値を抽出して一時テーブルに挿入するために使用できる長さを確認できます。

declare 
     f1 UTL_FILE.FILE_TYPE;
     V_str varchar(2000);
begin
     f1 := UTL_FILE.FOPEN('Directory','File_NAME.txt','W');
     loop
         UTL_FILE.GETLINE(F1,v_str);
         v1:=substr(v_str,1,2);
         v2:=substr(v_str,3,4);
         v3:=substr(v_str,7,3);
         v4:=substr(v_str,10,3);
         v5:=substr(v_str,13,7);
         v6:=substr(v_str,20,1);
         v7:=substr(v_str,21,7);
         insert into temp values(v1,v2,v3,v4,v5,v6,v7);
    end loop;
 exception
    when no_data_found then
       dbms_output.put_line('end reached');
end;
于 2013-03-13T13:38:26.990 に答える
0

次に例を示します。

Select trim(substr('B 344 ZenGDF9838987e0849399',1,2)) as Section, 
       trim(substr('B 344 ZenGDF9838987e0849399',3,4)) as Book1,
       trim(substr('B 344 ZenGDF9838987e0849399',7,3)) as Name,
       trim(substr('B 344 ZenGDF9838987e0849399',10,3)) as Book2,
       trim(substr('B 344 ZenGDF9838987e0849399',13,7)) as RollNo,
       trim(substr('B 344 ZenGDF9838987e0849399',20,1)) as Book2,
       trim(substr('B 344 ZenGDF9838987e0849399',21,7)) as RegionNo
from dual

スペースをなくすためにトリムを使用しました。しかし、多分それらは関連していますか?

于 2013-03-13T12:20:23.273 に答える
0

これも役立つ場合があります。同様の問題があり、Oracle-Baseフォーラムで助けを求めました。このクエリは、Oracle-Base.comのモデレーターであるTimによって作成されました。

SELECT REGEXP_SUBSTR(str, '[A-Z][a-z]+', 1, 1) col1,
       REGEXP_SUBSTR(str, '[A-Z]+', 1, 2) col2,
       REGEXP_SUBSTR(str, '[0-9]+', 1, 1) col3,
       REGEXP_SUBSTR(str, '[a-z]+', 1, 2) col4,
       REGEXP_SUBSTR(str, '[0-9]+', 1, 2) col5
  FROM
  (
   SELECT 'JoeBSD1639973e7378790' str FROM dual
  )
  /

COL1  COL2  COL3     COL4  COL5
-----------------------------------
Joe   BSD   1639973   e    7378790
于 2013-03-13T17:22:53.610 に答える