Как загрузить содержимое текстового файла в определенную структуру? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть файл .txt, подобный следующему. Каждый столбец представляет трехмерную точку (x, y, z) и два свойства (a, b).

1.7 5.5 -3.62   0.6 10.3    []
1.0 5.5 -3.21   0.9 12.4    []
1.2 5.9 -3.25   0.5 13.9    []
1.3 5.5 -3.19   0.9 15.9    []
1.0 5.2 -3.13   0.3 17.4    []
1.7 5.9 -3.07   0.5 19.6    []
2.5 5.5 -3.01   0.9 20.9    []
2.5 5.2 -3.95   0.4 22.9    []

Я хочу, чтобы содержимое этого текстового файла было загружено в определенную структуру, подобную этой:

myStruct.X, myStruct.Y, myStruct.Z, myStruct.A, myStruct.B

Как это сделать?

1 Ответ

1 голос
/ 23 октября 2019

Используйте dlmread, чтобы прочитать содержимое вашего текстового файла в некоторый массив, скажем, A. Это работает, так как у вас есть только числовые значения здесь. Предостережение: из документации, начиная с MATLAB R2019a:

dlmread не рекомендуется. Вместо этого используйте readmatrix.

Затем просто используйте правильную команду struct для нескольких полей и значений, например:

A = dlmread('data.txt')
myStruct = struct('X', A(:, 1), 'Y', A(:, 2), 'Z', A(:, 3), 'A', A(:, 4), 'B', A(:, 5))

Этоприводит к такому выводу (сокращенно):

  A =
      1.70000    5.50000   -3.62000    0.60000   10.30000    0.00000
      1.00000    5.50000   -3.21000    0.90000   12.40000    0.00000
      1.20000    5.90000   -3.25000    0.50000   13.90000    0.00000
      1.30000    5.50000   -3.19000    0.90000   15.90000    0.00000
      1.00000    5.20000   -3.13000    0.30000   17.40000    0.00000
      1.70000    5.90000   -3.07000    0.50000   19.60000    0.00000
      2.50000    5.50000   -3.01000    0.90000   20.90000    0.00000
      2.50000    5.20000   -3.95000    0.40000   22.90000    0.00000

  myStruct =

    scalar structure containing the fields:

      X =
         1.7000
         1.0000
         [...]

      Y =
         5.5000
         5.5000
         [...]

      Z =
         [...]

      A =
         [...]

      B =
         [...]

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Я тестировал вышеуказанный код с Octave 5.1.0, и так как ондо сих пор остается неясным, если показанный код полностью совместим с MATLAB, вот еще одно решение, использующее textscan, как также предлагается в Комментарий Неснижаемого лица :

fid = fopen('data.txt');
C = textscan(fid, '%f %f %f %f %f %*[^\n]')
myStruct = struct('X', C{1}, 'Y', C{2}, 'Z', C{3}, 'A', C{4}, 'B', C{5})
fclose(fid);

Трейлинг %*[^\n] в спецификаторе формата должен игнорировать все остальные символы после последнего %f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...