【问题标题】:reading and writing multiple data files in idl在idl中读写多个数据文件
【发布时间】:2019-11-15 02:28:56
【问题描述】:

我是 IDL 的新手,我试图从某个文件夹读取多个二进制数据文件,并将它们以文本格式一次写入某个文件夹。我目前有一个代码一次只能读取和写入一个文件,我必须手动命名,但是我需要一次读取和写入所有文件,以避免手动读取时出现命名错误。这是我的代码,请帮忙。我需要一次读取和写入多个数据文件。

    pro readfitacf

; Open the raw file for read only 


  inp=FitOpen('/media/New Volume/SANAE/2010_fitacf/2010 Jan/20100114.0931.17.san.fitacf',/read)


;  Search for a specific time in the file

;prm.bmnum = 15

;prm.nrang = 5

filename = '/project/2010 Jan/20100114.0931.17.san.txt'

OPENW,5,filename

其中Fitopen是如下函数


      function FitOpen,fname,atme=atme,lib=lib, $
               native=native,external=external, $
                read=read,write=write,update=update
mode=0

if (KEYWORD_SET(lib) eq 0) then lib=getenv('LIB_FITIDL')

if KEYWORD_SET(native) then mode=1

if KEYWORD_SET(external) then mode=2

if (mode eq 0) and (file_test(lib) eq 1) then mode=2 $

else if (mode eq 0) then mode=1


if (mode eq 1) then begin

if KEYWORD_SET(read) then openr,unit,fname,/GET_LUN,/SWAP_IF_BIG_ENDIAN

if KEYWORD_SET(write) then openw,unit,fname,/GET_LUN, /SWAP_IF_BIG_ENDIAN

if KEYWORD_SET(update) then openu,unit,fname,/GET_LUN, /SWAP_IF_BIG_ENDIAN

endif else begin

if KEYWORD_SET(read) then openr,unit,fname,/GET_LUN,/STDIO

if KEYWORD_SET(write) then openw,unit,fname,/GET_LUN,/STDIO

if KEYWORD_SET(update) then openu,unit,fname,/GET_LUN,/STDIO

endelse


return, unit

end

【问题讨论】:

    标签: idl idl-programming-language


    【解决方案1】:

    您可以使用FILE_SEARCH 搜索具有模式的特定文件并获取文件路径数组。然后,只需循环这个数组。要获取文件的基本名称,请使用 FILE_BASENAME:

    files = FILE_SEARCH('directory1/*.fitacf')
    
    FOR i = 0, N_ELEMENTS(files) - 1 DO BEGIN
        inp=FitOpen(files[i],/read)
        filename = 'directory2/'  + FILE_BASENAME(files[i], '.fitacf') + '.txt'
        OPENW, unit, filename, /GET_LUN
        ; do stuff
        FREE_LUN, unit, inp
    ENDFOR
    

    【讨论】:

    • 感谢您的回复,非常感谢。我试过了,它只读取和写入第一个文件并发出此错误“OPENW:文件单元已打开。单位:5”
    • 我编辑了我的答案。您必须确保不要重新打开打开的文件单元。
    • 这很有帮助,但代码在处理完第 28 个文件后停止并发出错误“OPENW:所有可用的逻辑单元当前正在使用中。”
    • 我认为错误来自 fitopen 函数,但我不知道如何在该函数中使用 FREE_LUN 来释放 GET_LUN 分配的逻辑单元
    • 你是对的。我没有注意到 FitOpen 没有释放它的 LUN。我再次添加了编辑。只需将“inp”变量添加到 FREE_LUN 命令即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多