Как преобразовать строку в таблицу с помощью `textscan`?

Я использую Matlab для чтения Данные о COVID-19 предоставлены Johns Hopkins в виде .csv-file, используя urlread, но я не уверен, как использовать textscan на следующем шаге, чтобы преобразовать строку в таблицу. Первые два столбца .csv-файла представляют собой строки, определяющие регион, за которыми следует большое количество столбцов, содержащих зарегистрированное количество заражений по дате.

В настоящее время я просто сохраняю строку, возвращенную urlread, локально, а затем открываю этот файл с помощью importdata, но, безусловно, должно быть более элегантное решение.


person Christian    schedule 19.03.2020    source источник
comment
Я бы не стал скачивать файлы, вы можете подхватить вирус.   -  person Daniel    schedule 19.03.2020
comment
Нет никакого риска. Компьютеры находятся на расстоянии более двух метров друг от друга...   -  person Christian    schedule 20.03.2020


Ответы (1)


Вы перепутали две вещи: либо вы хотите прочитать из загруженного CSV-файла с помощью «textscan» (и, конечно, «fopen», «fclose»), либо вы хотите использовать «urlread» (или, скорее, «webread» поскольку MATLAB рекомендует больше не использовать «urlread»). Я выбираю последнее, так как никогда не делал этого сам ^^

Итак, сначала мы читаем данные и разбиваем их на строки.

url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv";
% read raw data as single character array
web = webread(url);
% split the array into a cell array representing each row of the table
row = strsplit(web,'\n');

Затем мы выделяем таблицу (предварительное выделение полезно для MATLAB, поскольку оно хранит переменные по последовательным адресам в ОЗУ, поэтому заранее сообщите MATLAB, сколько места вам нужно):

len = length(row);
% get the CSV-header as information about the number of columns
Head = strsplit(row{1},',');
% allocate table 
S = strings(len,2);
N = NaN(len,length(Head)-2);
T = [table(strings(len,1),strings(len,1),'VariableNames',Head(1:2)),...
    repmat(table(NaN(len,1)),1,length(Head)-2)];
% rename columns of table
T.Properties.VariableNames = Head;

Обратите внимание, что я применил небольшой трюк, чтобы выделить так много повторяющихся столбцов «NaN», повторяя одну таблицу. Однако объединить эту таблицу с таблицей строк сложно, так как обе содержат имена столбцов var1 и var2. Именно поэтому я сразу переименовал столбец первой таблицы.

Теперь мы можем на самом деле заполнить таблицу (что немного неприятно из-за человека, который нашел хорошим написать «Корея, Юг» в файле, разделенном запятыми)

for i = 2:len
    % split this row into columns
    col = strsplit(row{i},',');
    % quick conversion
    num = str2double(col);

    % keep strings where the result is NaN
    lg = isnan(num);
    str = cellfun(@string,col(lg)); 
    T{i,1} = str(1);
    T{i,2} = strjoin(str(2:end));% this is a nasty workaround necessary due to "Korea, South"
    T{i,3:end} = num(~lg);
end

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

person max    schedule 19.03.2020