我有几行文字:
abc
def
ghi
我希望将这些多行分配给Matlab变量以进行进一步处理。
我正在从非常大的文本文件中复制它们,并希望在Matlab中处理它而不是将文本保存到文件中,然后逐行阅读以进行处理。
我尝试将上述文本行作为单个字符串处理,但在尝试分配给变量时遇到错误:
x = 'abc
def
ghi'
错误:
x = 'abc
|
Error: String is not terminated properly.
任何可以帮助我理解和解决问题的建议都将受到高度赞赏。
答案 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,可以直接粘贴。