2

大家好,提前感谢。这是我在这里的第一篇文章,如果我应该这样做,请告诉我。

我有一个包含如下行的大文本文件:

"DATE      TIMESTAMP    T W M     T AL M C  A_B_C"

起初我使用 fopen 和 fget1 命令阅读了这个,所以我得到了一个字符串:

Readout = DATE      TIMESTAMP    T W M     T AL M C A_B_C

我想通过例如 textscan 来转换它。虽然我觉得我知道 matlab,但我绝不是这个命令的专家,并且在使用它时遇到了麻烦。

我想得到:

A = 'Date' 'TIMESTAMP' 'T W M' 'T AL M C' 'A_B_C'

但是使用以下代码:

 A = textscan(Readout,'%s');
 A = A{1}';

我得到:

A = 'DATE'    'TIMESTAMP'    'T'    'W'    'M'    'T'    'AL'    'M'    'C'    'A_B_C'

正如我在标题中所问的,有没有办法忽略单个空格?

PS:在写这篇文章的最后,我只是想出了一个不太优雅的解决方案,我仍然想知道是否有更好的解决方案,但是:

ReadBetter = [];
for n = 1:length(Read)-1
if Read(n) == ' ' & Read(n+1) ~= ' '
else
    ReadBetter = [ReadBetter Read(n)];
end
end
ReadBetter = [ReadBetter Read(n+1)];
Read   
ReadBetter

Output:
Read =

DATE      TIMESTAMP    T W M     T AL M C   A_B_C

ReadBetter =

DATE     TIMESTAMP   TWM    TALMC   A_B_C

现在我可以将 ReadBetter 与 textscan 一起使用。

感谢这个很棒的网页和我在这里找到的帮助,在许多其他帖子中

4

4 回答 4

2

较新版本的 matlab 具有类似于 perl 的拆分的正则表达式的“拆分”选项。

>> str = 'DATE      TIMESTAMP    T W M     T AL M C  A_B_C';
>> out = regexp(str, '  +', 'split')

out = 

    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
于 2011-06-30T22:30:30.397 回答
1

解析字符串的一个更简单的解决方案是使用函数REGEXP查找连续有 2 个或更多空白字符的索引,使用这些索引将字符串分解为使用函数MAT2CELL的字符串单元格数组,然后使用函数STRTRIM从每个子字符串中删除前导和尾随空格。例如:

>> str = 'DATE      TIMESTAMP    T W M     T AL M C  A_B_C';
>> cutPoints = regexp(str,'\s{2,}');
>> cellArr = mat2cell(str,1,diff([0 cutPoints numel(str)]));
>> cellArr = strtrim(cellArr)

cellArr = 

    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
于 2011-06-30T15:26:25.660 回答
0

我认为你把事情弄得太复杂了。只需使用:

fid = fopen('pathandnameoffile');
textscan(fid,'%s','Delimiter','\t');

上面的示例假设您有制表符作为分隔符。如果需要,将其更改为其他内容。

于 2011-06-30T07:53:12.530 回答
0

这是读取文件的一种方法:

文件.dat

DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C
DATE      TIMESTAMP    T W M     T AL M C  A_B_C

MATLAB代码:

fid = fopen('file.dat', 'rt');
C = textscan(fid, '%s %s %c%c%c %c%2c%c%c %s');
fclose(fid);
C = [ C{1}, C{2}, ...
    cellstr( strcat(C{3},{' '},C{4},{' '},C{5}) ), ...
    cellstr( strcat(C{6},{' '},C{7},{' '},C{8},{' '},C{9}) ), ...
    C{10}
]

生成的单元格数组:

C = 
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
    'DATE'    'TIMESTAMP'    'T W M'    'T AL M C'    'A_B_C'
于 2011-06-30T15:31:18.000 回答