【问题标题】:MATLAB: textscan using width delimited txt fileMATLAB:使用宽度分隔的 txt 文件进行文本扫描
【发布时间】:2015-07-06 20:35:53
【问题描述】:

我正在尝试使用 textscan 函数导入一个以宽度分隔的 txt 文件。该文件有 80 个字符宽,没有分隔符,所需的 12 列是不同宽度的字符。我试图通过指定字符串的宽度来做到这一点,(即12个字符串,每个不同的字符宽度加起来为80)但是只要有空格(因为缺少某些值)MATLAB就会解释这个作为我的分隔符并弄乱了格式。

data= textscan(fileID, '%5s %7s %1s %1s %1s %17s %12s %12s %10s %5s %6s %3s');

我可以使用 Excel 解决这个问题,但这似乎是一个糟糕的解决方案。有什么方法可以使用 MATLAB 来做到这一点,也许是一个不同于 textscan/make textscan 的函数忘记分隔符,只处理字符串的宽度?

【问题讨论】:

    标签: matlab width textscan


    【解决方案1】:

    您需要将分隔符和空白字符的值更改为空:

    format_string = '%5s %7s %1s %1s %1s %17s %12s %12s %10s %5s %6s %3s';
    C = textscan(fid, format_string, 'delimiter', '', 'whitespace', '');
    

    这样 MATLAB 会将每个字符(包括空格)视为有效字符。

    【讨论】:

    • 这正是我想要的。伟大的!谢谢!
    【解决方案2】:

    嗯,我在使用 textscan 时遇到了同样的问题。好吧,这里还有很长的路要走(这绝不是最好的解决方案,但应该可以)

    fid=fopen('txtfile.txt','rt'); %//load in file
    a=fscanf(fid'%c');       %//scan the thing into chars
    fclose(fid);
    
    for r = 0:NumberOfRowsInUrData -1    %//Now the loop... Number of rows in your data can also be calculated by size(a,2)/20 
    b(r+1,:) = a(1+20*r:20*(r+1)); %// this will correctly index everything 
    end
    

    好消息是,现在所有内容都在矩阵 b 中,您可以像 string1 = b(:,1:5) 这样简单地索引您的字符,它会将所有内容输出到一个不错的矩阵中。

    c 的缺点是 for 循环,我认为你应该可以用 cellfun 之类的东西来替换它。

    【讨论】:

    • 我对 matlab 很陌生,所以我可能在这里遗漏了一些明显的东西,但它似乎不起作用。 b 返回一个 2x20 char ,仅由第一行数据的前 40 个字符组成。想解释一下循环是如何工作的? (意义为 20 等)在此先感谢!
    • 嗯,循环基本上以逻辑格式索引长字符序列。我用 fid 作为上限,这可能是一个错误(我用它来做一个简单的测试),基本上,上限应该是数据中的行数。对于数据的每一行,索引对应于该行的 20 个字符。
    • 我将 20 更改为 80,因为我认为这就是您的意思。一旦我这样做,就会出现一个奇怪的结果。 b 是正确的尺寸(32x80 字符),但只有第一行看起来像它的意思。 tiikoni.com/tis/view/?id=45abcce这就是我的意思
    • 嗯,所以它似乎缩进了 1?奇怪,它对我来说很好用,你试过索引它吗?即 b(:,75:80) 看看它是什么样子的?
    • 我认为这可能是 Matlab 以一种有趣的方式呈现/显示值,我在测试中似乎没有遇到同样的问题。如果将 NumberOfRowsInUrData 更改为 32,并更改 a(1+80*r:80*(r+1)),这应该给出 32*80 的正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多