如何在Matlab中为字符串变量分配多行

时间:2018-02-19 11:48:51

标签: string matlab multiline multilinestring

我有几行文字:

abc
def
ghi

我希望将这些多行分配给Matlab变量以进行进一步处理。

我正在从非常大的文本文件中复制它们,并希望在Matlab中处理它而不是将文本保存到文件中,然后逐行阅读以进行处理。

我尝试将上述文本行作为单个字符串处理,但在尝试分配给变量时遇到错误:

x = 'abc
def
ghi'

错误:

x = 'abc
        |
Error: String is not terminated properly.

任何可以帮助我理解和解决问题的建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

您的错误是因为您在MATLAB期待结束引号字符时结束了该行。必须使用数组表示法来生成多行或多元素数组。

如果使用数组表示法,可以这样指定

x = ['abc'
     'def'
     'hij']
>> x = 3×3 char array

注意:使用此方法,您的行必须具有相同的字符数,因为您实际上处理的是character array。您可以将字符数组视为数字矩阵,因此它必须为“矩形”。

如果你有MATLAB R2016b或更新版本,你可以使用string数据类型。这使用双引号"..."而不是单引号'...',并且可以是多行的。您仍必须使用数组表示法:

x = ["abc"
     "def"
     "hijk"]
>> x = 3×1 string array

我们每行可以有不同数量的字符,因为这只是一个3元素的字符串数组,而不是字符数组。

或者,使用字符数组(或字符串)的单元格数组

x = {'abc'
     'def'
     'hijk'}
>> x = 3×1 cell array

同样,您可以在单元格数组中包含不同长度的字符数组或字符串。

在上面的所有例子中,换行只是为了便于阅读,可以用分号;代替,以表示数组的下一行。

您选择的选项取决于您要对文本执行的操作。如果您正在读取文件,我建议使用字符串数组或单元格数组,因为它们可以处理不同长度的行。为了向后兼容,请使用单元阵列。您可能会发现cellfun与在单元阵列上运行相关。对于本机字符串操作,请使用字符串数组。

答案 1 :(得分:2)

我经常这样做,即将我想要硬编码的其他地方的文本复制到MATLAB脚本中(在我的情况下,它通常是SQL代码,我想操作并从MATLAB调用)。

为实现这一点,我在clipboard2cellstr.m中有一个辅助函数,定义如下:

function clipboard2cellstr

str = clipboard('paste');
str = regexprep(str, '''', ''''''); % Double any single quotes
strs = regexp(str, '\s*\r?\n\r?', 'split');
cs = sprintf('{\n''%s''\n}', strjoin(strs, sprintf('''\n''')));
clipboard('copy', cs);
disp(cs)
disp('(Copied to Clipboard)')

end

然后我使用Ctrl-c复制文本(或者然后)并运行clipboard2cellstr。这会将剪贴板的内容更改为我可以使用Ctrl-v(或者然而然)粘贴到MATLAB编辑器中的内容。

例如,复制此行

和这一行

和这个,然后运行该函数生成这个:

{
'For example, copying this line'
'and this line'
'and this one, and then running the function generates this:'
}

这是有效的MATLAB,可以直接粘贴。