Может ли IDL 8.5 читать таблицы со строками, датами и значениями?

Я очень новичок на сцене 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 обр)

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

(а также остальные мои переменные)

Я надеюсь, что вы можете помочь здесь. Может быть, я что-то неправильно понял, если так, пожалуйста, дайте мне знать.

Буду благодарен за любые другие предложения или решения.

Заранее спасибо!

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]
Другие вопросы по тегам