【问题标题】:How to assign multiple lines to a string variable in Matlab如何在Matlab中将多行分配给字符串变量
【发布时间】:2018-07-29 15:40:10
【问题描述】:

我有几行这样的文字:

abc
def
ghi

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

我正在从非常大的文本文件中复制这些内容,并希望在 Matlab 中对其进行处理,而不是将文本保存到文件中,然后逐行读取以进行处理。

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

x = 'abc
def
ghi'

错误:

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

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

【问题讨论】:

    标签: string matlab multiline multilinestring


    【解决方案1】:

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

    为了实现这一点,我在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。

    【讨论】:

    • 谢谢。我正在寻找确切的这个功能。再次感谢
    【解决方案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 与在单元阵列上操作相关。对于本机字符串操作,请使用字符串数组。

    【讨论】:

    • 我有大约 10 个文本行并从文件中复制它们,并且希望避免在每行中添加“”或“”。我想找到绕过这一步的方法。
    • 我想一次又一次地重复这个过程。复制大文件的一部分并处理它并重复它......
    • 你可以试试textscan
    • 听起来您正在将文件的行复制并粘贴到您的 Matlab 代码中?只需读入文件(使用 Adiel 建议的 textscanfscanf)并根据需要附加到上述数组类型之一。从文件中读取时,您不必手动添加' '" ",这些只是表示您在示例中/使用手动输入时处理的变量类型。
    猜你喜欢
    • 2019-08-19
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2020-10-08
    • 2013-05-09
    相关资源
    最近更新 更多