Fortran Coder

标题: 将一个文件中的前几行内容放在另一个文件的前几行 [打印本页]

作者: 978142355    时间: 2016-10-13 15:54
标题: 将一个文件中的前几行内容放在另一个文件的前几行
本帖最后由 978142355 于 2016-10-13 15:56 编辑

如题,打算把aa.cube文件的前10行放在pot.cub文件的最开头,自己写了程序,如下。由于两个文件都比较大(单个210M,仅仅上传了删改后的数据),发现需要5分钟才能转化完成,还不如手动直接复制粘贴……………………所以开贴求助大家,如何既能实现如题的功能,时间消耗的还比较少。
[Fortran] 纯文本查看 复制代码
    program pot_head
    implicit none
    integer i,j,ierr
    character(len=84) str

    open(11,file='aa.cube')
    open(12,file='temp1')
    open(13,file='pot.cub')
    open(14,file='temp2')
    i=0
    do
        read(11,"(a84)",iostat=ierr) str
        if(str(9:10)=='E') exit
        if(ierr/=0) exit
        i=i+1
    end do
    rewind(11)
    do j=1,i
        read(11,"(a84)") str
        write(12,"(a84)") str
    end do
    close(11)
    rewind(12)
    do j=1,i
        read(12,"(a84)") str
        write(14,"(a84)") str
    end do
    do
        read(13,"(a84)",iostat=ierr) str
        if (ierr/=0) exit
        write(14,"(a84)") str
    end do
    close(12,status='delete')
    close(13,status='delete')
    rewind(14)
    open(15,file='pot.cub')
    do
        read(14,"(a84)",iostat=ierr) str
        if(ierr/=0) exit
        write(15,"(a84)") str
    end do
    close(14,status='delete')
    close(15)
    read(*,*)
    end program pot_head


input.rar

9.75 KB, 下载次数: 14

输入文件,解压后出现aa.cube和pot.cub


作者: li913    时间: 2016-10-13 16:43
[Fortran] 纯文本查看 复制代码
program pot_head
USE IFPORT
implicit none
integer i, j, n, ierr
character(len=512) :: str = ''

open(11,file='aa.cube',status='old')
open(12,file='temp1')
do i = 1, 10
    read(11,"(a)",iostat=ierr) str
    if(str(9:10)=='E' .or. ierr/=0) exit
                write(12,"(a)") trim(str)
end do
close(11)

open(13,file='pot.cub',status='old')
do
    read(13,"(a)",iostat=ierr) str
    if (ierr/=0) exit
    write(12,"(a)") trim(str)
end do
close(13,status='delete')
close(12)
! ivf扩展函数,改文件名
i = rename('temp1','pot.cub')
if(i==0) then
        write(*,*) '成功'
else
        write(*,*) '失败'
end if
read(*,*)
end program pot_head

作者: 978142355    时间: 2016-10-13 17:02
谢谢Li老师,您的这个代码减少了一次复制数据的过程,windows下速度还是不敢恭维,不过Linux系统下可以接受,再次谢谢您。PS:这扩展函数还是很不错的,虽然老大的视频里强调过能不用就不用,但这次不知道有没有其他方法可以替代这个扩展函数。
作者: pasuka    时间: 2016-10-13 23:17
本帖最后由 pasuka 于 2016-10-13 23:20 编辑

最简单的话,先把aa.cube的头10行的数据写入文件pot_new.cub
然后用管道命令添加后续内容
Windows可以dos命令譬如
type pot.cub >> pot_new.cub


作者: 978142355    时间: 2016-10-14 08:25
pasuka 发表于 2016-10-13 23:17
最简单的话,先把aa.cube的头10行的数据写入文件pot_new.cub
然后用管道命令添加后续内容
Windows可以dos命 ...

嗯,谢谢pasuka老师,这种方法很简洁,也很简单,速度的话,和上面Li老师的差不多,谢谢你的建议,让我又知道了一种方法。
作者: pasuka    时间: 2016-10-14 09:17
本帖最后由 pasuka 于 2016-10-14 09:18 编辑
978142355 发表于 2016-10-14 08:25
嗯,谢谢pasuka老师,这种方法很简洁,也很简单,速度的话,和上面Li老师的差不多,谢谢你的建议,让我又 ...

过奖了
换成copy命令合并两个文件,也许能进一步提高效率譬如
3.将文件1.txt和2.txt合并为3.txt

copy /b c:\1.txt+2.txt c:\3.txt

命令格式:copy /b 文件1+文件2+......文件N 合并后的文件名
命令讲解:使用"+"将多个相同或不同格式的文件合并为一个文件。

小提示:
1.在尾部隐藏了文本数据的图片文件,在使用了其他文件编辑器并保存后,隐藏的文本数据有可能丢失。
2.MP3文件在使用此方法连接后,就可以实现连续播放。
3.合成图片/歌曲这样的二进制文件必须使用/b参数(b代表Binaty,二进制),否则将会失败;另一个合并参数是/a(ASCII,文本文件),只能用于纯文本的合并。两参数不能同时使用,二进制方式可以合并文本文件和二进制文件,而文本方式用于纯文本的合并。


作者: 978142355    时间: 2016-10-15 09:41
pasuka 发表于 2016-10-14 09:17
过奖了
换成copy命令合并两个文件,也许能进一步提高效率譬如

太感谢您了,您的这个方法非常不错,这个是在windows下可以,Linux系统下不知道可不可以?再次感谢您又提供了一个新的方法O(∩_∩)O~
作者: vvt    时间: 2016-10-15 11:28
head -10 aa.cube > pot_new.cub
cat pot.cub >> pot_new.cub
作者: 978142355    时间: 2016-10-15 19:46
vvt 发表于 2016-10-15 11:28
head -10 aa.cube > pot_new.cub
cat pot.cub >> pot_new.cub

谢谢vvt。Linux命令,这个速度非常快,几乎是一瞬间完成,看来得加入脚本,谢谢O(∩_∩)O~,这个帖子学到了好多东西,非常感谢。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2