【问题标题】:Get column values from multi-line text file从多行文本文件中获取列值
【发布时间】:2016-09-09 21:29:58
【问题描述】:

如何使用文本文件中的数据填充列,其中每一行都是不同的列?文本文件如下所示:

Amsterdam Aalsmeerweg  
Aalsmeerweg
14
Amsterdam
NL
1059NJ
0204122131

Amsterdam Bos en Lommerweg
Bos en Lommerweg
215
AMSTERDAM
NL
1055DT
0206847676

Amsterdam Ceintuurbaan  
Ceintuurbaan  
314 
AMSTERDAM
NL
1072GL
0204705292

This post 没有帮助我。

我的代码如下所示:

set serveroutput on;
 CREATE or replace DIRECTORY USER_DIR AS '/home/renejanssen/'; 
 GRANT READ ON DIRECTORY USER_DIR TO PUBLIC;
 declare
  V1 VARCHAR2(200); 
  F1 UTL_FILE.FILE_TYPE; 
  f_name WINKEL.NAAM%type;
  f_adres varchar2(255);
  f_homenr WINKEL.HUISNR%TYPE;
  f_city varchar2(100);
  f_countrcode varchar(255);
  f_zipcode WINKEL.POSTCODE%TYPE;
  f_phonenr WINKEL.TELNR%TYPE;
  v_counter number DEFAULT 1; --counter for ID
 BEGIN
  F1 := UTL_FILE.FOPEN('USER_DIR','test','R');
   Loop
    BEGIN
     UTL_FILE.GET_LINE(F1,V1);
     dbms_output.put_line(v_counter || ' = ' || V1);
     EXCEPTION WHEN No_Data_Found THEN EXIT;
     dbms_output.put_line('niets'); 
    END;                                
   f_name     := substr(V1,1); 
   f_adres     := substr(V1,1);
   f_homenr    := substr(V1,1);                    
   f_countrcode  := substr(V1,1);
   f_zipcode  := substr(V1,1);        
   insert INTO WINKEL (ID, NAAM, HUISNR, POSTCODE, TELNR ) 
   values(v_counter, f_name, f_homenr, f_zipcode, f_phonenr);           
   v_counter := v_counter +1;
 end loop; 
 IF UTL_FILE.IS_OPEN(F1) THEN
 dbms_output.put_line('File is Open');
 end if;                 
 UTL_FILE.FCLOSE(F1); 
END;    

【问题讨论】:

  • 每个条目总是有 7 行吗?如果不是,您是否使用空行作为分隔符,您将如何映射文件变量中的行?
  • 我不知道,你有什么建议。我只知道每一行都需要一个变量。
  • 不确定你的意思,这是你的数据?
  • 不,它是一个学校项目。我在这里做错了什么?
  • 如果是学校项目,可以假设每个“记录”为七行,每次都以完全相同的顺序,用空行分隔。

标签: oracle plsql


【解决方案1】:

如果文件中的每个条目总是如您所显示的那样有七行,然后是一个空行,那么您可以直接对您的 PL/SQL 变量进行七次读取:

declare
  v1 varchar2(200);
  f1 utl_file.file_type;
  f_name winkel.naam%type;
  f_adres varchar2(255);
  f_homenr winkel.huisnr%type;
  f_city varchar2(100);
  f_countrcode varchar(255);
  f_zipcode winkel.postcode%type;
  f_phonenr winkel.telnr%type;
  v_counter number default 1; --counter for ID
begin
  f1 := utl_file.fopen('D42','test','R');
  loop
    begin
      utl_file.get_line(f1, f_name);
      utl_file.get_line(f1, f_adres);
      utl_file.get_line(f1, f_homenr);
      utl_file.get_line(f1, f_city);
      utl_file.get_line(f1, f_countrcode);
      utl_file.get_line(f1, f_zipcode);
      utl_file.get_line(f1, f_phonenr);
    exception
    when no_data_found then
      exit;
      dbms_output.put_line('niets');
    end;
    insert into winkel(id, naam, huisnr, postcode, telnr)
    values (v_counter, f_name, f_homenr, f_zipcode, f_phonenr);
    v_counter := v_counter +1;
    begin
        -- consume possible blank line; don't error as final entry may not have one
    utl_file.get_line(f1, f_adres);
dbms_output.put_line('extra line: ' || f_adres);
    exception
    when no_data_found then
dbms_output.put_line('extra line: ' || sqlerrm);
      null;
    end;  
  end loop;
  if utl_file.is_open(f1) then
    dbms_output.put_line('File is Open');
  end if;
  utl_file.fclose(f1);
end;
/

使用您的数据文件填充表格:

从温克尔中选择 *;

        ID NAAM                                     HUISNR     POSTCODE   TELNR        
---------- ---------------------------------------- ---------- ---------- --------------
         1 Amsterdam Aalsmeerweg                    14         1059NJ     0204122131    
         2 Amsterdam Bos en Lommerweg               215        1055DT     0206847676    
         3 Amsterdam Ceintuurbaan                   314        1072GL     0204705292    

【讨论】:

  • Okey Alex,这对我有很大帮助,我可以从那里开始工作。谢谢!
  • @ReneJanssen - 如果答案确实是您需要的,习惯上将其标记为“正确答案” - 这样问题就不会出现在未回答问题列表中。这将有助于为论坛上的志愿者节省时间。干杯!
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多