暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用UTL_FILE包从文件中删除最后一个空行

askTom 2016-01-06
947

问题描述

嗨,

我正在使用UTL_FILE包中的普特过程创建一个新文件。这将在文件末尾插入一个空的新行。
你能给我建议怎么从文件中删除这最后一行吗?
我不希望最后一行空包含在我的文件中。我的文件也是一个.csv文件,大小为2-3 GB。因此,建议我采取适当的方法,在不妨碍性能的情况下删除最后一条空行。

以下是示例:

宣布
文件UTL_FILE.file_type ;
fileData VARCHAR2(2096):='这是测试行'; --文件内容
fileName VARCHAR2(50):='Test File.txt';
路径VARCHAR2(2096):='FLS03_DIR_CAR_REQ'; -- Oracle目录名
开始
文件:= utl_file.fOpen (路径,文件名,'W') ;
utl_file.put_line (文件,文件数据) ;
utl_file.put (文件,'下一行测试') ;
IF ( utl_file.is_Open(file)) then
utl_file.f Close(file) ;
结束IF ;
结束;

上面的测试过程创建一个名为“Test File.txt”的文件,并在其中写入单个文件。写完那一行后,文件中就会附加一个新行字符。我只是不想在最后多出一条新线路。
我的代码是用上面的文件写入逻辑实现的。但是,在我的代码中,行数可能会变成1000万行,这取决于业务逻辑。

因此,你能让我知道如何删除最后一个空行在文件的末尾。

请按要求查找资料。
通过使用上述代码,我得到的实际输出是:
第1行:这是测试行
线路2 :
在这里,在写完第一行(即第1行)之后,就会写出一个换行符,即第2行,尽管这一行上没有写任何东西。我不想写任何没有任何内容的多余的行。我需要以下结果:
第1行:这是测试行

在我的代码中,写入文件后,我们将把文件发送到另一个系统。在其中,通过读取文件的内容来加载文件。现在,在这个系统里,他们希望每一行都有内容。但是,在文件的末尾,他们得到的是一行,但没有内容,这将导致一个错误。

因此,请建议我任何解决方案,写一个行在一个文件,结束没有任何新的行。

专家解答

使用标准utl_file (即文本模式) *we*控制行尾语义。因此,正如您所看到的,我们负责CR和LF

SQL> declare
  2  file UTL_FILE.file_type;
  3  fileData VARCHAR2(2096):='This is the test line'; -- File Content
  4  fileName VARCHAR2(50):= 'TestFile.txt';
  5  path VARCHAR2(2096):='TEMP'; -- Oracale Directory Name
  6  begin
  7  file := utl_file.fopen(path,fileName,'W');
  8  utl_file.put_line(file, fileData);
  9  utl_file.put(file,'Next Line Test');
 10  IF (utl_file.is_open(file)) THEN
 11  utl_file.fclose(file);
 12  END IF;
 13  end;
 14  /

PL/SQL procedure successfully completed.

C:\temp>od -c TestFile.txt
0000000   T   h   i   s       i   s       t   h   e       t   e   s   t
0000020       l   i   n   e  \r  \n   N   e   x   t       L   i   n   e
0000040       T   e   s   t  \r  \n
0000047



如果*你*想完全控制文件,那么你可以以原始的方式访问文件,例如

SQL> declare
  2    file UTL_FILE.file_type;
  3    fileData VARCHAR2(2096):='This is the test line'; -- File Content
  4    fileName VARCHAR2(50):= 'TestFile.txt';
  5    path VARCHAR2(2096):='TEMP'; -- Oracale Directory Name
  6    crlf varchar2(2) := chr(10)||chr(13);
  7  begin
  8  file := utl_file.fopen(path,fileName,'wb');
  9  utl_file.put_raw(file, utl_raw.cast_to_raw(fileData||utl_Tcp.crlf));
 10  utl_file.put_raw(file,utl_raw.cast_to_raw('Next Line Test'));
 11  IF (utl_file.is_open(file)) THEN
 12  utl_file.fclose(file);
 13  END IF;
 14  end;
 15  /

PL/SQL procedure successfully completed.

C:\temp>od -c TestFile.txt
0000000   T   h   i   s       i   s       t   h   e       t   e   s   t
0000020       l   i   n   e  \r  \n   N   e   x   t       L   i   n   e
0000040       T   e   s   t
0000045



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论