Расположение ячеек Textscan и Regexp - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь заставить некоторую логику работать с некоторым устаревшим кодом Matlab. Я подумал, что проще всего сделать так, чтобы данные выглядели так же, как ожидает код.

Я читаю соответствующие данные из файла CSV, это довольно просто - но формат идентификаторов изменилсяот простого числа до идентификатора вида [YY, ZZZZ].

Например, «предыдущие» данные CSV выглядели так:

1,Simple,Data
2,More,Data-Dash-Data
3,Even,More
4,Really,More

«Новые» данные CSVвыглядит так:

[01,0001],Simple,Data
[02,1001],More,Data-Dash-Data
[03,9876],Even,More
[04,1234],Really,More

Ранее для чтения данных использовалась эта логика:

 fid = fopen(fileName);
 data = textscan(fid,'%s%s%s%*s','Delimiter',',');

Когда это было сделано с «предыдущими» данными CSV, возвращались данные, которыевыглядят так:

data =
  1×3 cell array
    {4×1 cell}    {4×1 cell}    {4×1 cell} 

Затем ячейки выглядят следующим образом:

K>> data{:}

ans =

  4×1 cell array

    '1'
    '2'
    '3'
    '4'


ans =

  4×1 cell array

    'Simple'
    'More'
    'Even'
    'Data'


ans =

  4×1 cell array

    'Data'
    'Data-Dash-Data'
    'More'
    'Data'

Поэтому, чтобы обработать идентификатор формы [YY, ZZZZ], мне пришлось изменить текстовое сканированиелогика для обработки нового формата идентификатора, который мы используем. Для этого я использую функцию регулярного выражения:

fid = fopen(fileName);
rawData = textscan(fid,'%s','Delimiter','\n');
data = regexp(rawData{1},'[ \-\/\w]*([\[][^\)\]]*[\]])?', 'match')

Затем, после чтения данных, я получаю данные, отформатированные так:

K>> data

data =

  4×1 cell array

    {1×3 cell}
    {1×3 cell}
    {1×3 cell}
    {1×3 cell}

K>> data{:}

ans =

  1×3 cell array

    '[01,0001]'    'Simple'    'Data'


ans =

  1×3 cell array

    '[02,1001]'    'More'    'Data-Dash-Data'


ans =

  1×3 cell array

    '[03,9876]'    'Even'    'More'


ans =

  1×3 cell array

    '[04,1234]'    'Really'    'More'

ТакВы можете видеть, что в нем содержатся правильные данные - но данные выложены по-другому, что нарушает устаревший код. Поэтому мой вопрос заключается в том, как я могу сделать так, чтобы «новые» данные выкладывались так, как они исходили из логики «textcan»:

data =
  1×3 cell array
    {4×1 cell}    {4×1 cell}    {4×1 cell}  

1 Ответ

2 голосов
/ 06 октября 2019

Вы можете использовать fileread для непосредственного чтения в необработанном файле. После этого вы можете использовать регулярное выражение, которое разделяется на запятую, за которой не следует цифра, или на возврат каретки.

c = regexp(fileread(fileName),',(?!\d)|\r\n','split');
formattedData = {c(1:3:end)',c(2:3:end)',c(3:3:end)'};

>> formattedData

formattedData =

  1×3 cell array

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