Matlab:我如何读取用空格分隔但忽略单个空格的字符串(使用textscan)?

时间:2011-06-30 07:36:43

标签: matlab file-io textscan

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

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

"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与文本扫描一起使用。

感谢这个非常棒的网页和我在这里找到的帮助,还有很多其他帖子

4 个答案:

答案 0 :(得分:2)

较新版本的matlab对regexp有一个'split'选项,类似于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'

答案 1 :(得分: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'

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

以下是阅读文件的一种方法:

FILE.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'