Заменить плохой символ из строки Matlab - PullRequest
1 голос
/ 09 апреля 2019

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

function replaceBadCharacters(name)

    BadChar = '<>:"/\|?*';
    bad = ismember(BadChar, name);
    if contains(name, ' ') || any(BadChar)
        name = strrep(name, ' ', '_'); 
        name = strrep(name, BadChar(bad), '_'); 
    end
end

, и я хотел бы заменить space и BadChar из символа и заменить его на _.Но моя функция не работает.

Например, у меня есть символ Manager principal или Manager/principal, и я хотел бы изменить его на Manager_principal

Спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 09 апреля 2019

РЕДАКТИРОВАТЬ : Как указано в ответе gehbiszumeis , реальной проблемой является отсутствующее возвращаемое значение.Я прошу прощения за то, что не указал на это в первую очередь.


Ваша функция может быть упрощена до следующего:

function name = replaceBadCharacters(name)

  BadChar = '<>:"/\|?* ';
  bad = ismember(name, BadChar);
  name(bad) = '_';

end

Вы можете просто добавить "пробел" к вашемуBadChar массив символов.Также обратите внимание на Индексирование с логическими значениями .

Некоторые тесты:

>> replaceBadCharacters('Manager principal')
ans = Manager_principal

>> replaceBadCharacters('Manager/principal')
ans = Manager_principal

>> replaceBadCharacters('Manager?principal')
ans = Manager_principal
2 голосов
/ 09 апреля 2019

Ваша функция работает правильно, но не имеет определенных возвращаемых параметров. Заменить первую строку на

function name_corrected = replaceBadCharacters(name)

и это сработает. Сравните документацию или введите doc function в командной строке MATLAB, чтобы изучить все синтаксические возможности.

1 голос
/ 10 апреля 2019

Я думаю, что использование замены - лучший вариант, и если вы можете использовать строку, вы также получите повышение производительности.Вот сравнение:

>> replaceBadCharacters_ismember("Manager principal");
Elapsed time is 9.271434 seconds.

>> replaceBadCharacters_replace_char("Manager principal");
Elapsed time is 2.021813 seconds.

>> replaceBadCharacters_replace_string("Manager principal");
Elapsed time is 0.856642 seconds.

function result = replaceBadCharacters_ismember(name)

    BadChar = '<>:"/\|?* ';

    tic
    for i = 1:1e6
        result = name;
        bad = ismember(result, BadChar);
        result(bad) = '_';
    end
    toc
end

function result = replaceBadCharacters_replace_char(name)

    name = char(name);
    BadChar = ["<" ">" """" "\" "/" "|" "?" "*" " "];

    tic
    for i = 1:1e6
        result = replace(name, BadChar, '_');
    end
    toc
end

function result = replaceBadCharacters_replace_string(name)

    name = string(name);
    BadChar = ["<" ">" """" "\" "/" "|" "?" "*" " "];

    tic
    for i = 1:1e6
        result = replace(name, BadChar, '_');
    end
    toc
end
...