Импортируйте блок смешанных данных из текстового файла в таблицу или массив ячеек

Этот пример читает блок смешанных текстовых и числовых данных из текстового файла, а затем импортирует блок данных в таблицу или массив ячеек.

Обзор файла данных

Образец файла bigfile.txt содержит строки с комментариями, начинающиеся с # #. Данные расположены в пяти столбцах: Первый столбец содержит текст, указывающий временные метки. Второй, третий и четвертый столбцы содержат числовые данные, указывающие на температуру, влажность и скорость ветра. Последний столбец содержит описательный текст. Отобразите содержимое файла bigfile.txt.

type('bigfile.txt')
## A	ID = 02476
## YKZ Timestamp Temp Humidity Wind Weather
06-Sep-2013 01:00:00	6.6	89	4	clear
06-Sep-2013 05:00:00	5.9	95	1	clear
06-Sep-2013 09:00:00	15.6	51	5	mainly clear
06-Sep-2013 13:00:00	19.6	37	10	mainly clear
06-Sep-2013 17:00:00	22.4	41	9	mostly cloudy
06-Sep-2013 21:00:00	17.3	67	7	mainly clear
## B	ID = 02477
## YVR Timestamp Temp Humidity Wind Weather
09-Sep-2013 01:00:00	15.2	91	8	clear
09-Sep-2013 05:00:00	19.1	94	7	n/a
09-Sep-2013 09:00:00	18.5	94	4	fog
09-Sep-2013 13:00:00	20.1	81	15	mainly clear
09-Sep-2013 17:00:00	20.1	77	17	n/a
09-Sep-2013 18:00:00	20.0	75	17	n/a
09-Sep-2013 21:00:00	16.8	90	25	mainly clear
## C	ID = 02478
## YYZ Timestamp Temp Humidity Wind Weather

Импортируйте блок данных как таблицу

Чтобы импортировать данные как таблицу, используйте readtable с настройками импорта.

Создайте объект настроек импорта для файла с помощью detectImportOptions функция. Укажите местоположение данных с помощью DataLines свойство. Для примера - строки 3 через 8 содержат первый блок данных. Опционально можно задать имена переменных с помощью VariableNames свойство. Наконец, импортируйте первый блок данных с помощью readtable с opts объект.

opts = detectImportOptions('bigfile.txt'); 
opts.DataLines = [3 8];
opts.VariableNames = {'Timestamp','Temp',...
                      'Humidity','Wind','Weather'};
T_first = readtable('bigfile.txt',opts) 
T_first=6×5 table
         Timestamp          Temp    Humidity    Wind         Weather     
    ____________________    ____    ________    ____    _________________

    06-Sep-2013 01:00:00     6.6       89         4     {'clear'        }
    06-Sep-2013 05:00:00     5.9       95         1     {'clear'        }
    06-Sep-2013 09:00:00    15.6       51         5     {'mainly clear' }
    06-Sep-2013 13:00:00    19.6       37        10     {'mainly clear' }
    06-Sep-2013 17:00:00    22.4       41         9     {'mostly cloudy'}
    06-Sep-2013 21:00:00    17.3       67         7     {'mainly clear' }

Прочтите второй блок, обновив DataLines свойство местоположению второго блока.

opts.DataLines = [11 17];
T_second = readtable('bigfile.txt',opts)
T_second=7×5 table
         Timestamp          Temp    Humidity    Wind        Weather     
    ____________________    ____    ________    ____    ________________

    09-Sep-2013 01:00:00    15.2       91         8     {'clear'       }
    09-Sep-2013 05:00:00    19.1       94         7     {'n/a'         }
    09-Sep-2013 09:00:00    18.5       94         4     {'fog'         }
    09-Sep-2013 13:00:00    20.1       81        15     {'mainly clear'}
    09-Sep-2013 17:00:00    20.1       77        17     {'n/a'         }
    09-Sep-2013 18:00:00      20       75        17     {'n/a'         }
    09-Sep-2013 21:00:00    16.8       90        25     {'mainly clear'}

Импортируйте блок данных как массив ячеек

Можно импортировать данные как массив ячеек с помощью readcell функция со detectImportOptions, или при помощи textscan функция. Сначала импортируйте блок данных с помощью readcell а затем выполните тот же импорт при помощи textscan.

Чтобы выполнить импорт с помощью функции readcell, создайте объект настроек импорта для файла с помощью detectImportOptions функция. Укажите местоположение данных с помощью DataLines свойство. Затем выполните операцию импорта, используя readcell функция и объект настроек импорта opts.

opts = detectImportOptions('bigfile.txt'); 
opts.DataLines = [3 8]; % fist block of data
C = readcell('bigfile.txt',opts)
C=6×5 cell array
  Columns 1 through 4

    {[06-Sep-2013 01:00:00]}    {[ 6.6000]}    {[89]}    {[ 4]}
    {[06-Sep-2013 05:00:00]}    {[ 5.9000]}    {[95]}    {[ 1]}
    {[06-Sep-2013 09:00:00]}    {[15.6000]}    {[51]}    {[ 5]}
    {[06-Sep-2013 13:00:00]}    {[19.6000]}    {[37]}    {[10]}
    {[06-Sep-2013 17:00:00]}    {[22.4000]}    {[41]}    {[ 9]}
    {[06-Sep-2013 21:00:00]}    {[17.3000]}    {[67]}    {[ 7]}

  Column 5

    {'clear'        }
    {'clear'        }
    {'mainly clear' }
    {'mainly clear' }
    {'mostly cloudy'}
    {'mainly clear' }

Чтобы выполнить импорт с помощью textscan function, задайте размер блока используя N и формат полей данных, используя formatSpec. Для примера используйте '%s' для текстовых переменных, '%D' для переменных даты и времени или '%c' для категориальных переменных. Установите 'DateLocale' аргумент имя-значение в 'en_US' обеспечить перевод имен месяцев на английский язык. Использование fopen чтобы открыть файл. Затем функция возвращает идентификатор файла fileID. Далее прочтите из файла при помощи textscan функция.

N = 6;
formatSpec = '%D %f %f %f %c';
fileID = fopen('bigfile.txt');

Прочтите первый блок и отобразите содержимое переменной Humidity.

C_first = textscan(fileID,formatSpec,N,'CommentStyle','##','Delimiter','\t','DateLocale','en_US')
C_first=1×5 cell array
  Columns 1 through 4

    {6x1 datetime}    {6x1 double}    {6x1 double}    {6x1 double}

  Column 5

    {6x1 char}

C_first{3}
ans = 6×1

    89
   NaN
    95
   NaN
    51
   NaN

Обновите размер блока N и считайте второй блок. Отобразите содержимое пятой переменной Weather.

N = 7;
C_second = textscan(fileID,formatSpec,N,'CommentStyle','##','Delimiter','\t','DateLocale','en_US')
C_second=1×5 cell array
  Columns 1 through 4

    {7x1 datetime}    {7x1 double}    {7x1 double}    {7x1 double}

  Column 5

    {7x1 char}

C_second{5}
ans = 7x1 char array
    'm'
    '...'
    'm'
    '...'
    'm'
    '...'
    'c'

Закройте файл.

fclose(fileID);

См. также

| | | |

Похожие темы