IDL 8.5 是否能够读取其中包含字符串、日期和值的表格?
Is IDL 8.5 able to read tables with strings, dates and values in it?
我是 IDL 领域的新手,我为一个问题苦苦挣扎了几个小时,希望你能帮助我:
所以现在我正在尝试从 table ("file.txt") 中读取数据。我想,每一列都保存在一个变量中(我考虑过使用 STRARR)
我找到了这个教程:http://www.idlcoyote.com/tips/ascii_column_data.html
这非常有用,当您想读取每一列的 numbers 时,效果很好。
这是上面教程中的 table:
教程table:
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
对于数字来说,看起来相当不错。
但是当我有包含日期、时间和数字的字符串时呢,就像这样:
我的table:
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
到这个结果(当然是因为FLTarr)
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
(以及我的其余变量)
我希望你能在这里提供帮助。
也许我误解了什么,如果是的话请告诉我。
对于任何其他建议或解决方案,我将不胜感激。
提前致谢!
我的建议是以某种方式使用 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]
我是 IDL 领域的新手,我为一个问题苦苦挣扎了几个小时,希望你能帮助我:
所以现在我正在尝试从 table ("file.txt") 中读取数据。我想,每一列都保存在一个变量中(我考虑过使用 STRARR)
我找到了这个教程:http://www.idlcoyote.com/tips/ascii_column_data.html
这非常有用,当您想读取每一列的 numbers 时,效果很好。 这是上面教程中的 table:
教程table:
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
对于数字来说,看起来相当不错。 但是当我有包含日期、时间和数字的字符串时呢,就像这样:
我的table:
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
到这个结果(当然是因为FLTarr)
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
(以及我的其余变量)
我希望你能在这里提供帮助。 也许我误解了什么,如果是的话请告诉我。
对于任何其他建议或解决方案,我将不胜感激。
提前致谢!
我的建议是以某种方式使用 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]