我在IDL场景中非常新,我在问题上挣扎了几个小时,我希望你能帮助我:
所以现在我正在尝试从表中读取数据(“file.txt”)。我想,每列都保存在一个变量中(我考虑过使用STRARR)
我找到了这个教程:http://www.idlcoyote.com/tips/ascii_column_data.html
当您想要读取每列的数字时,这非常有用,效果很好。 这是上面教程中的表格:
教程表:
Experiment 01-14-97-2b9c
No. of Data Rows: 5
Temperature Pressure Relative Humidity
20.43 0.1654 0.243
16.48 0.2398 0.254
17.21 0.3985 0.265
18.40 0.1852 0.236
21.39 0.2998 0.293
代码:
OPENR, lun, "tutorial.txt", /GET_LUN
header = STRARR(3)
READF, lun, header
data = FLTARR(3, 5)
READF, lun, data
temperature = data(0,*)
print, data
print, temperature
输出数据:
20.4300 0.165400 0.243000
16.4800 0.239800 0.254000
17.2100 0.398500 0.265000
18.4000 0.185200 0.236000
21.3900 0.299800 0.293000
输出温度:
20.4300
16.4800
17.2100
18.4000
21.3900
对于数字看起来相当不错。 但是当我有日期,时间和数字的字符串时,如下所示:
我的表:
Experiment 01-14-97-2b9c
No. of Data Rows: 5
Date Start time End time Value
12-Feb-2002 05:08:10 06:08:30 20
08-Mar-2002 07:35:38 09:25:59 100
20-Jun-2002 12:30:35 16:15:18 5536
25-Jul-2002 04:02:06 07:02:58 5822
02-Aug-2002 23:30:25 23:55:22 456
上面的代码将不再有效。当我使用此my_var= data(0,*)
时,整个数据将保存在变量my_var
中,当然因为数据不再是列,而是整行。
FLTARR正在设置此数据
12-Feb-2002 05:08:10 06:08:30 20
到这个结果(当然因为 FLT arr)
12.0000
5.00000
6.00000
20.0000
STRARR正在my_var
保存好数据,但不分隔列。
我想要的是什么:
我想在一个变量中包含每一列,以便稍后我可以在另一个代码中处理这些变量数据。
dates = data(0,*)
starts = data(1,*)
ends = data(2,*)
values = data(3,*)
print, starts
输出: 开始时间
05:08:10
07:35:38
12:30:35
04:02:06
23:30:25
(以及其他变量)
我希望你能在这里提供帮助。 也许我误会了什么,如果是的话请让我知道。
对于任何其他建议或解决方案,我将不胜感激。
提前致谢!
答案 0 :(得分:1)
我的建议是以某种方式使用STRSPLIT
,在您阅读时或在结尾处使用每一行。
以下是最后完成所有操作的示例。首先,将数据读入data
数组(忽略header
数组):
IDL> openr, lun, 'file.txt', /get_lun
IDL> header = strarr(3)
IDL> readf, lun, header
IDL> data = strarr(5)
IDL> readf, lun, data
IDL> free_lun, lun
然后拆分空白:
IDL> tokens = strsplit(data, /extract)
最后,按位置提取元素:
IDL> dates = (tokens.map(lambda(x: x[0]))).toarray()
IDL> starts = (tokens.map(lambda(x: x[1]))).toarray()
IDL> ends = (tokens.map(lambda(x: x[2]))).toarray()
IDL> values = (tokens.map(lambda(x: long(x[3])))).toarray()
您现在已经掌握了自己的价值观:
IDL> help, dates, starts, ends, values
DATES STRING = Array[5]
STARTS STRING = Array[5]
ENDS STRING = Array[5]
VALUES LONG = Array[5]
IDL> print, values
20 100 5536 5822 456
更新:确保您已完成
IDL> compile_opt strictarr
在这些命令之前的范围内。
更新:按value
排序这些数组:
IDL> ind = sort(values)
IDL> values = values[ind]
IDL> dates = dates[ind]
IDL> starts = starts[ind]
IDL> ends = ends[ind]