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]