1. 需要用到的函数
openr, 1, 路径——》1表示该路径下文件的内存地址的代称
变量 = file_lines(路径)——》传入文件所在的路径,返回该文件的行数
readf, 代称, 接收数据的变量——》第一个参数为文件的内存地址的代称, 第二个是接收数据的变量
skip_lun, 代称, 行数, /lines——》指定文件的代称, 指定需要跳过的行数, /lines表示前面跳过的是行
free_lun, 1代称——》指定文件的代称, 用于关闭文件的内存占用
2. 编程
pro week_six_study1 ; 如何读取文本数据(主要是读取txt、csv后缀的文本文件)(txt是以空格分隔,csv是以半角逗号分隔) ; 路径 file_path = 'D:/IDL_program/experiment_data/chapter_4/2013_year_aop.txt' ; 小白读取txt文件 ; 打开该txt文件——》如果你只是读文件openr就可以了,openw既可以读也可以写(会覆盖原来的文件,慎用) openr, 1, file_path ; 第一个1用来表示这个文件的内存地址,第二个是该文件的路径 ; 由于第一行是索引,索引是文字,索引下面是数字, 两者类型不一致,不能放在一个数组里面存储,所以需要跳过 skip_lun, 1, 1, /lines ; 第一个1表示文件的编号或者说是内存地址的代称,第二个1表示需要跳过的行数,这里只跳过第一行,所以是1,第三个表示第二个参数的单位是行而不是列 ; 创建存储的数组 box_data = fltarr(5, 56304) ; 通过记事本打开该文件事先查看到该文件的数据的行列数(共有5列56305行,但是第一行跳过所以只需要56304行) ; 获取文件的数据 readf, 1, box_data ; 检验一下 print, box_data[0, -1] ; 发现一个新的玩意就是idl的取值也可以负值去取(和python一样,不详讲),这里等价于box_data[0, 56303] ; 关闭文件(养成好习惯) free_lun, 1 ; 正常人读取txt文件 ; 打开该txt文件 openr, 1, file_path ; 假如你上面没有free_lun,1那么这里是打不开的 ; 拿到第一行的索引数据,这也是有用的(获取列数),跳过显得有些浪费 ; 预先有一个str变量存储 str = '' readf, 1, str ; 这里你可能会疑惑,但是呢?readf是秉承着有多少给多少,现在str是一个字符串,默认输出一行,如果你是数组,那么根据数组的行列数有多少给多少 ; 对得到的存储有第一行索引数据的str变量进行分析,通过该字符串分析出整个数据有多少列 son_str_array = strsplit(str, /extract) ; 不传入以什么作为分隔符,默认以空格作为该字符串的分隔符 ; son_str_array里面有几个元素,那么整个数据就有几列 column = n_elements(son_str_array) ; 现在获取行数 row = file_lines(file_path) - 1 ; 第一行是索引,我们不放进下面的数组里面 ; 创建存储的数组 box_data = fltarr(column, row) ; 获取数据(这里得到的行数是从第二行的开头开始的,因为前面已经readf, 1, str了,所以文件指针已经指到了第二行开头处) readf, 1, box_data ; 检验一下 print, box_data[0, -1] ; 关闭文件 free_lun, 1 ; 高手读取txt文件 ; 打开文件 openr, 1, file_path ; 跳过第一行 skip_lun, 1, 1, /lines ; 读取文件的行数 row = file_lines(file_path) - 1 ; 创建存储的列表 box_data = fltarr(5, row) ; 这里的5是通过txt记事本打开看到的 ; 获取txt文件数据 readf, 1, box_data ; 检验一下 print, box_data[0, -1] ; 关闭文件 free_lun, 1 ; 可能你会问,着有什么高级,我想说,高级不是什么东西都要编程去完成,高效才是最重要的 ; 在这种文件里面,我们知道列数一般是不会变化的,所以直接用记事本打开看一下又何妨,但是行数由于每一个文件的行数都不一样 ; 如果是一个文件那么还好,如果是很多文件,你都用记事本打开看一下吗,这是不现实,多了的我就不讲了。 ; 读取csv文件 ; 路径 file_path = 'D:/IDL_program/experiment_data/chapter_4/air_quality_data.csv' ; 读取文件 data = read_csv(file_path, header=par_name) ; 第一行的索引给了数据给了par_name(但是无论你需不需要第一行索引数据,read_csv()函数默认都不会去读取第一行的数据) ; 查看data的类型 help, data ; 可以发现,这是一个结构体 ; 输出第一列数据 print, data.(0) ; 输出第一行的索引数据 print, par_name ; 输出列索引是NO2的数据(第一种方法你可以自己去数它所在的列号按上面的方式进行读取并输出,也可以按下面这种方法) NO2_index = where(par_name eq 'NO2') print, data.(NO2_index) end