文件重写——急需答案

fei00fei 2004-12-08 08:46:48
目的是编写数据文件,在文件头中写入数据类型和数据记录条数,文件体中写入需要的数据。所生成文件为.txt文档。由于所需数据实在些文件的过程中提取并筛选的,所以在写文件头的过程中无法预先计算出记录条数,而是写完文件体后重新改写文件头。
请问:是否能够重新写文件,请提供成功的重写文件的例子。
我在oracle 9i 文档中查找到fseek指针定位函数,但他仅能用在文件读的方式下,也就是说只有文件以读的方式打开时才能用此函数。
我的测试代码:
declare
v_FileDir varchar2(50):='/report/abstraction/MoneyLaundering';
v_FileHandle utl_file.file_type;
v_FileName varchar2(40):='';
begin
v_FileName := 'test'||'-'||to_char(i)||'.txt';
v_FileHandle:=utl_file.fopen(v_FileDir,v_FileName,'r'); -- 此种情况下fseek函数可用
utl_file.fseek(v_FileHandle,1,5);
end;
请各位高手相助!
...全文
218 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fei00fei 2004-12-09
  • 打赏
  • 举报
回复
我用将数据提取到数组中,然后在写文件的过程中统一写入。
这样不仅解决了我对数据需要反复筛选的需要,而且如果以后需要加入手工输入的数据时,我也有办法了。
谢谢两位的帮助。
*^_^*
ATGC 2004-12-09
  • 打赏
  • 举报
回复
楼主如果能把你的需求明确的说出来
俺可以帮你写一程序,读写文本文件。。不需要用oracle的
ATGC 2004-12-09
  • 打赏
  • 举报
回复
楼主写的文件格式还是看了不明白
我觉得对文件的读写还是不要用oracle好
用其它语言比较好,比如java,perl等
CodeMagic 2004-12-09
  • 打赏
  • 举报
回复
给你一个两个文件对拷的例子。

create or replace procedure pp is
i number;
str varchar2(1000);
handle utl_file.file_type;

type tarr is varray(1000) of varchar2(1000);
arr tarr:=tarr();
begin
i:=1;
arr.extend;

handle:=utl_file.fopen('e:\','test.txt','r');
loop
begin
utl_file.get_line(handle,str);
exception
when no_data_found then exit;
end;

i:=i+1;
arr.extend;
arr(i):=str;
end loop;
utl_file.fclose(handle);

if i=1 then
arr(1):=0;
else
arr(1):=i;
end if;

handle:=utl_file.fopen('e:\','new.txt','w');
for i in arr.first..arr.last loop
utl_file.put_line(handle,arr(i));
end loop;
utl_file.fclose(handle);

exception
when others then
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm(sqlcode));
end;
ATGC 2004-12-09
  • 打赏
  • 举报
回复
"写文件头的过程中无法预先计算出记录条数"
========================================
应该可以吧

游标的 %rowcount
CodeMagic 2004-12-09
  • 打赏
  • 举报
回复
给你一个两个文件对拷的例子。

create or replace procedure pp is
i number;
str varchar2(1000);
handle utl_file.file_type;

type tarr is varray(1000) of varchar2(1000);
arr tarr:=tarr();
begin
i:=1;
arr.extend;

handle:=utl_file.fopen('e:\','test.txt','r');
loop
begin
utl_file.get_line(handle,str);
exception
when no_data_found then exit;
end;

i:=i+1;
arr.extend;
arr(i):=str;
end loop;
utl_file.fclose(handle);

if i=1 then
arr(1):=0;
else
arr(1):=i;
end if;

handle:=utl_file.fopen('e:\','new.txt','w');
for i in arr.first..arr.last loop
utl_file.put_line(handle,arr(i));
end loop;
utl_file.fclose(handle);

exception
when others then
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm(sqlcode));
end;
CodeMagic 2004-12-09
  • 打赏
  • 举报
回复
那就用数组来实现吧
fei00fei 2004-12-09
  • 打赏
  • 举报
回复
我试了方法2:
取数据的时候就写入文件中,然后生成一个新的文件,在新文件中写入记录数,然后使用fcopy函数,把老文件中的内容拷到新文件中。
现做个fcopy函数的功能的总结:
fcopy函数的功能是将源文件中指定行复制到一个新的文件,对于已存在的新文件会被覆盖,而后生成的文件无法继续在文件尾写入。
sanoul 2004-12-08
  • 打赏
  • 举报
回复
up
CodeMagic 2004-12-08
  • 打赏
  • 举报
回复
思路:
1 使用数组,把数据写到数组中,然后把数组中的数据写到文件中。
2 使用fcopy函数,在新文件中写入记录数,然后再把老文件中的内容拷到新文件中。
ATGC 2004-12-08
  • 打赏
  • 举报
回复
另外,楼主是否能把你要生成的文件格式说一下呢?
ATGC 2004-12-08
  • 打赏
  • 举报
回复
基本思路
select记录到数组里面
然后遍历数组写入文本文件

楼主并没有把你的需求将清楚

楼主是要把select出来的记录写到文本文件里吗?
CodeMagic 2004-12-08
  • 打赏
  • 举报
回复
可以吧,函数的使用方法并没有说明fseek不能用于文件的write模式,看看帮助怎么写的。
fei00fei 2004-12-08
  • 打赏
  • 举报
回复
我原本想用系统包utl_file中的fseek函数,但好像无法实现
CodeMagic 2004-12-08
  • 打赏
  • 举报
回复
我需要生成的是文本文件。在存储过程的最初是用游标从数据库中提取数据,在存储过程中在对游标中的结果集一一筛选,得到真正需要的数据——这一筛选过程是必需的。

=============================================================
这并不意味着取数据的时候就写文件,你可以用个数组来临时保存这些数据,最后根据得到的记录数来回填数组的第一个元素,然后再将数组的所有元素顺序写入文件中。

另一种方法:

取数据的时候就写入文件中,然后生成一个新的文件,在新文件中写入记录数,然后使用fcopy函数,把老文件中的内容拷到新文件中。
fei00fei 2004-12-08
  • 打赏
  • 举报
回复
文件格式:
{ -- 文件头
单位 时间 等其他固定信息
数据种类1标识 -- 共9类数据,但不一定都写入文件
数据种类1记录数
数据种类1总长度
数据种类2标识
数据种类2记录数
数据种类2总长度
.........
}
{ -- 文件体
数据种类1标识
数据种类1记录数
数据种类1总长度
数据种类1记录 每条记录为一行
........
数据种类2标识
数据种类2记录数
数据种类2总长度
数据种类2记录
........
}
fei00fei 2004-12-08
  • 打赏
  • 举报
回复
我需要生成的是文本文件。在存储过程的最初是用游标从数据库中提取数据,在存储过程中在对游标中的结果集一一筛选,得到真正需要的数据——这一筛选过程是必需的。由于记录条数是在文件头的地方写的,所以在最后确认记录数目的时候就需要重新写记录数。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧