【问题标题】:Extract data from file name and store it in a table using stored procedure从文件名中提取数据并使用存储过程将其存储在表中
【发布时间】:2018-09-14 11:53:27
【问题描述】:

我在一个目录中有不同类型的文件(pdf、csv、doc、txt)。

文件名如下:

John.Doe.19900101.TX.pdf         //FirstName.LastName.DOB.StateOfResidence  
Bruce.Banner.19700101.PA.doc     
Steve.Rodgers.19760101.AR.csv    
Tony.Stark.19901210.CA.txt      

如何在Oracle中编写存储过程来读取目录中的文件并提取FirstName, LastName, DOB, State并将其存储在适当列的表中?

例如:对于文件John.Doe.19900101.TX.pdf,应该这样提取数据:

John in FirstName column  
Doe in LastName column   
19900101 in DOB column  
TX in State column  
whole file in CLOB column

【问题讨论】:

  • 您坚持哪一点,阅读目录列表,或将文件名拆分成它们的组成部分?您已经走了多远 - 包含您目前拥有的代码以及为什么它没有按照您想要的方式进行操作会很有帮助。

标签: sql oracle stored-procedures


【解决方案1】:

您必须在操作系统级别工作才能从操作系统目录收集文件名。考虑到您正试图从 Unix 风格中获取信息;以下 URL 将帮助您将文件列表抓取到表格甚至视图中。

你需要的代码是:

--drop directory SCRIPT_TEMP_DIR;

CREATE DIRECTORY SCRIPT_TEMP_DIR AS '/home/oracle/oracle_scripts'
;
GRANT EXECUTE ON DIRECTORY SCRIPT_TEMP_DIR TO USER_NAME
;  -- Here USER_NAME will be your SCHEMA/USER NAME

drop table USER_NAME.home_directory purge;

CREATE TABLE USER_NAME.home_directory
(
 filerecord VARCHAR2(15),
 flink VARCHAR2(2),
 fowner VARCHAR2(6),
 fgroup VARCHAR2(8),
 fsize VARCHAR2(32),
 fdate_part1 VARCHAR2(16),
 fdate_part2 VARCHAR2(16),
 fdate_year_or_time VARCHAR2(16),
 fname VARCHAR2(255)
)
 ORGANIZATION EXTERNAL
 (
 TYPE ORACLE_LOADER
 DEFAULT DIRECTORY SCRIPT_TEMP_DIR
 ACCESS PARAMETERS
 (
 records delimited by newline
 preprocessor SCRIPT_TEMP_DIR:'listing.sh'
 fields terminated by whitespace
 (
 filerecord ,
 flink ,
 fowner ,
 fgroup ,
 fsize ,
 fdate_part1 ,
 fdate_part2 ,
 fdate_year_or_time ,
 fname 
 )
 )
 LOCATION ('listing.sh')
 )
REJECT LIMIT UNLIMITED;

完成后,您只需要从上面创建的表格中进行选择。

SELECT *
  FROM USER_NAME.home_directory;

稍后您可以应用 substr/instr 函数来拆分信息。您也可以使用正则表达式函数来获取所需的信息。

SELECT fname, 
    regexp_substr(fname, '[^.]+', 1, 1) part1, 
    regexp_substr(fname, '[^.]+', 1, 2) part2,
    regexp_substr(fname, '[^.]+', 1, 3) part3
  FROM USER_NAME.home_directory;

这给了你:

需要关注的网址是here 上面粘贴的代码在您需要更改 USER_NAME 的地方进行了修改,同时授予目录权限。

【讨论】:

  • 我很抱歉没有提到这个目录不是操作系统目录。我有目录的路径,我需要读取文件名,从文件名中提取值,将这些提取的值与 CLOB 列中的实际文件一起存储在现有表中。
  • 并且 regexp_substr() 正在按预期工作。但是,无论文件类型如何,如何将其与目录中的所有文件循环?
  • @intruder :如果您遵循上面的代码。它为您提供由 CREATE TABLE 命令创建的外部表中的所有文件名。稍后,当您运行从上面的 HOME_DIRECTORY 表中选择数据的查询时,它会为您提供分隔成多个列的文件名。您可以调整您的查询并污染您的结果。类似于 SELECT FILENAME_PART1 || ' ' ||文件名_第 3 部分 || ' ' ||来自 HOME_DIRECTORY 的文件名_第 4 部分;不要忘记将我的答案标记为正确答案,因为它为您提供了完整的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2022-07-20
  • 2016-08-14
  • 2020-04-29
  • 2014-04-19
相关资源
最近更新 更多