Чтение форматированного текста в MATLAB

avatar
GntS
8 апреля 2018 в 10:09
399
2
0

У меня есть несколько текстовых файлов, к которым я хочу получить доступ в рабочей области MATLAB. Справка MATLAB говорит, что я могу использовать fscanf, fgetl и textscan. Я выбрал последний из-за форматированного текста. Я написал следующие сценарии:

filename = 'myFile.txt';
fid = fopen(filename);
myData = textscan(fid, '%u64 %{dd/MM/yyyy}D %{hh:mm:ss.SSS}T %f64 %f64 %u64 %f64 %f64 %f64\r\n', 'HeaderLines', 3)
fclose(fid);

но я получаю сообщение об ошибке:

Ошибка при использовании текстового сканирования

Невозможно проанализировать вектор символов формата в позиция 21 ==> %{HH:mm:ss.SSS}T %f64 %f64 %u64 %f64 %f64 %f64

Формат даты должен иметь вид %T или %{...}T.

Отформатированные тексты:


--------------------------------------------------------------------------------------------------
Row     Var1        Var2           Var3    Var4         Var5         Var6    Var7        Var8 
--------------------------------------------------------------------------------------------------
1       08/04/2018  09:56:52.790   020.00  019.999570   1999690178   055.00  010.020000  000.00000  
2       08/04/2018  09:56:52.821   020.00  019.999602   1999690178   055.00  010.020000  000.00000  
3       08/04/2018  09:56:52.852   020.00  019.999580   1999690178   055.00  010.020000  000.00000  
4       08/04/2018  09:56:52.883   020.00  019.999623   1999690179   055.00  010.020000  000.00000  
5       08/04/2018  09:56:52.915   020.00  019.999548   1999690179   055.00  010.020000  000.00000  
6       08/04/2018  09:56:52.946   020.00  019.999602   1999690179   055.00  010.020000  000.00000  
7       08/04/2018  09:56:52.993   020.00  019.999548   1999690179   055.00  010.020000  000.00000  
8       08/04/2018  09:56:53.024   020.00  019.999602   1999690179   055.00  010.020000  000.00000  
9       08/04/2018  09:56:53.055   020.00  019.999548   1999690179   055.00  010.020000  000.00000  

Источник
Matt
8 апреля 2018 в 13:40
0

Почти уверен, что проблема в формате duration. Я думаю, что ему нужен нижний регистр h вместо H.

Ответы (2)

avatar
Tommaso Belluzzo
8 апреля 2018 в 13:31
1

Я всегда старался избегать использования fscanf, importdata, textscan и подобных функций, потому что с ними может быть сложно иметь дело, и я думаю, что их вывод иногда нелегко манипулировать. Кроме того, ваш формат файла очень похож на тот, который Matlab использует для отображения данных таблиц... Я думаю, что это прекрасно указывает вам правильное направление.

Я рекомендую вам использовать readtable не только по вышеупомянутым причинам, но и потому, что таблицы очень универсальны в Matlab:

T = readtable('data.txt', ...
      'Format', '%d %{dd/MM/yyyy}D %{HH:mm:ss.SSS}D %f %f %f %f %f %f', ...
      'HeaderLines', 3)

Конечный результат:

T =

  9×9 table

    Var1       Var2           Var3        Var4      Var5          Var6       Var7    Var8     Var9
    ____    __________    ____________    ____    _________    __________    ____    _____    ____

    1       08/04/2018    09:56:52.790    20       19.99957    1999690178    55      10.02    0   
    2       08/04/2018    09:56:52.821    20      19.999602    1999690178    55      10.02    0   
    3       08/04/2018    09:56:52.852    20       19.99958    1999690178    55      10.02    0   
    4       08/04/2018    09:56:52.883    20      19.999623    1999690179    55      10.02    0   
    5       08/04/2018    09:56:52.915    20      19.999548    1999690179    55      10.02    0   
    6       08/04/2018    09:56:52.946    20      19.999602    1999690179    55      10.02    0   
    7       08/04/2018    09:56:52.993    20      19.999548    1999690179    55      10.02    0   
    8       08/04/2018    09:56:53.024    20      19.999602    1999690179    55      10.02    0   
    9       08/04/2018    09:56:53.055    20      19.999548    1999690179    55      10.02    0   

П.С. = формат %{...}T, вероятно, связан с вводящим в заблуждение способом обработки сообщений об ошибках формата со стороны Matlab, только %{...}D является допустимым форматом литерала даты и времени, по крайней мере, до Matlab 2017A.

avatar
Milad
8 апреля 2018 в 11:08
1

Использовать

myData = textscan(fid, '%u64 %{dd/MM/yyyy}D %{hh:mm:ss.SSS}D %f64 %f64 %u64 %f64 %f64 %f64\r\n', 'HeaderLines', 3);

Я не думаю, что существует %T. %D — дата и время (для даты и времени).

Matt
8 апреля 2018 в 13:37
0

%T вполне допустимо в последней версии. Я не помню, когда он был добавлен.

GntS
8 апреля 2018 в 13:58
0

@Milad, справка MATLAB говорит Example: '%{hh:mm:ss}T' specifies the format of a duration such as '10:30:15', which represents 10 hours, 30 minutes, and 15 seconds.

Milad
8 апреля 2018 в 14:05
0

@GntS Какую документацию вы читаете? Веб-сайт или помощь в вашем Matlab? Возможно, это новая функция, которую ваш Matlab не поддерживает. Я не мог использовать %T и вместо этого использовал %d, который я отправил код.