【问题标题】:Changing from textread to textscan MATLAB从 textread 更改为 textscan MATLAB
【发布时间】:2012-07-12 14:45:03
【问题描述】:

我在将使用 textread 函数的代码更改为 textscan 时遇到问题。

data.txt 的内容:(注意:我已将所有实际坐标更改为 dddd.mmmmmm,ddddd.mmmmmm

$GPGGA,104005.3,dddd.mmmmmm,N,ddddd.mmmmmm,W,1,05,4.4,73.4,M,48.0,M,,*7E
$GPGGA,104006.3,dddd.mmmmmm,N,ddddd.mmmmmm,W,1,05,2.1,73.5,M,48.0,M,,*7F
$GPGGA,104007.3,dddd.mmmmmm,N,ddddd.mmmmmm,W,1,05,2.1,74.0,M,48.0,M,,*70
$GPGGA,104008.3,dddd.mmmmmm,N,ddddd.mmmmmm,W,1,05,2.4,73.9,M,48.0,M,,*7C
$GPGGA,104009.3,dddd.mmmmmm,N,ddddd.mmmmmm,W,1,04,2.4,73.9,M,48.0,M,,*75

代码:

fid = fopen('E:\data.txt','r');
Location=zeros(2,);
Block = 1;
while(~feof(fid))
   A=textscan(fid,'%*s %*s %s %*s %s %*s %*s %*s %*s %*s','delimiter',',','delimiter','\n');
   Location(:)=[%s %s]';
   x=Location(1,:);
   y=Location(2,:);
   Block = Block+1;
end
display(Location);

新代码错误。我在这里使用了 2 个分隔符。如果它们不为空,我想从每行中取出纬度和经度值。我该如何纠正它?另外,如果文本文件中有许多不同的行,我需要做什么才能仅从以 $GPGGA 开头的行中获取 Lat Long 值?

【问题讨论】:

    标签: matlab file-io csv readfile textscan


    【解决方案1】:

    此代码应满足您的要求并放入正确的标志(请检查):

    fid = fopen('data.txt','r');
    A=textscan(fid,'%s %*s %f %s %f %s %*s %*s %*s %*s %*s %*s %*s %*s %*s','Delimiter',',');
    fclose(fid);
    Location = [A{[2, 4]}];
    row_idxs = cellfun( @(s) strcmp(s, '$GPGGA'), A{1});
    Location = Location(row_idxs, :);
    LatSigns = -2*cellfun(@(dir) strcmp(dir, 'S'), A{3}(row_idxs))+1;
    LongSigns = -2*cellfun(@(dir) strcmp(dir, 'W'), A{5}(row_idxs))+1;
    Location = Location .* [LatSigns LongSigns];
    display(Location);
    

    【讨论】:

    • 非常感谢您解决了问题...我还需要检查第 4 和第 6 个元素。如果第 4 个和第 6 个元素分别是 S 和 W,我需要在 Lat 和 Long 添加负号。这可能吗?
    • 不客气 - 我更新了代码以说明这些迹象。
    • 嗨,我刚刚检查了这段代码。当我在输入文件 $GPGSV,4,4,16,27,,,,26,,,,24,,,,22,,,*79 中有这一行时它不起作用