2013-03-13 2 views
0

У меня есть текстовый файл с данными следующим образом:данных разбора из одной колонки в нескольких столбцов

A 123 JoeBSD1639973e7378790 
A 344 TomGDF7393694e0902087 
B 344 ZenGDF9838987e0849399 

Я использовал SQLLDR навалом вставить временную таблицу, и все данные в одном столбце, так как я здесь нет полевого разделителя.

Теперь я хочу, чтобы отделить эти данные в столбцах следующим образом:

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 

Как я могу определить поля использует длину полукокса, как Секция 2 Длина, Книга1 составляет 4, зовут 3, Book2 3, RollNo - 7, Book3 - 1, а RegNo - 7.

Может ли кто-нибудь помочь мне с запросом сделать это преобразование?

+2

Использование SubStr, так как речь идет о фиксированной длины блока http://www.techonthenet.com/oracle/functions/substr.php –

+0

The Основной вопрос здесь - длина ваших первых двух полей: раздел и книга1. Разделяет ли поле 2 символа и книгу 4 или книга 5 и раздел 1? Основываясь на данных, внешний вид состоит в том, что секция может быть 2 символа и книга 4, но мы не можем сделать вывод, что из представленных данных есть образец строки без каких-либо пробелов? – xQbert

+0

Вы правы Раздел может быть 2 символа, но в представленном наборе данных отображается только 1 символ. Аналогично, книга 1 может быть 4, но в этом примере установить это только 3. – Monica

ответ

1

Мы также можем использовать UTL файлы для извлечения данных из плоских файлов и УТ файлы будут извлекать данные в виде самой строки, так как вы konw длины вы можете использовать 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; 
+0

Спасибо. Это работает :-) – Monica

1

SubStr() функция, что вам нужно: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions162.htm

Вы могли бы рассмотреть возможность использования внешней таблицы вместо SQL Loader вставки во временную таблицу, так как вы можете легко применять функции SQL в файл данные и разделить столбцы во время чтения файла.

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 

я использовал триммер для устранения пробелов; но, может быть, они актуальны?

1

вы можете использовать зиЬзЬг

например:

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; 
0

Это также может помочь. У меня схожая проблема, и я попросил о помощи на форумах Oracle-Base. Этот запрос был написан Тим - модератор Oracle-Base.com:

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 
Смежные вопросы