在 matlab 中以两行读取混合的 .csv
Reading mixed .csv in two lines in matlab
我有下面的 csv.file 部分
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\lang1033\f0\fs17
$GPGGA, 142621.00, 4106.29338717, N, 02901.18386180, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
$GPGGA, 142622.00, 4106.29339273, N, 02901.18387863, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
$GPGGA, 142623.00, 4106.29339566, N, 02901.18386326, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
.
.
.
我在行尾遇到问题 \par,因为我无法读取值 103.3
而且我无法让程序使用混合变量同时读取 2 行 2 行(跳过“\par”行)
这得到了 /par 的权限,但它不是格式化阅读。我不确定使用 "csvread or fscanf"
fid = fopen('filename','r+');
C = textscan(fid, '%s', 'Delimiter', '\n', 'CommentStyle', '\','headerlines',2);
C = C{:}; fclose(fid);
我不确定 textscan 是否能够读取每第 n 行,但我会使用 fgets 逐行读取您的文件:
% Initialize arrays
GPGGAArray = [];
SDDBTArray = [];
% open file
fid = fopen('filename','r+');
% Skip 2 header lines
currentLine = fgets(fid);
currentLine = fgets(fid);
while ischar(currentLine)
currentLine = fgets(fid);
if currentLine == -1
break;
end
% line with GPGGA
C1 = textscan(currentLine, '%s', 'Delimiter', ',');
currentLine = fgets(fid);
if currentLine == -1
break;
end
GPGGAArray = [GPGGAArray; [str2double(C1{1,1}{2}), str2double(C1{1,1}{3}), str2double(C1{1,1}{5}),...
str2double(C1{1,1}{7}), str2double(C1{1,1}{8}), str2double(C1{1,1}{9}), str2double(C1{1,1}{10}(1:end-4))]];
% line with SDDBT
C2 = textscan(currentLine, '%s', 'Delimiter', ',');
SDDBTArray = [SDDBTArray; [str2double(C2{1,1}{2}), str2double(C2{1,1}{4}), str2double(C2{1,1}{6}),...
str2double(C2{1,1}{7}(3:end-4))]];
% skip line with \par
currentLine = fgets(fid);
end
% Close file
fclose(fid);
请注意,C1 和 C2 是包含字符串的元胞数组。
我有下面的 csv.file 部分
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\lang1033\f0\fs17
$GPGGA, 142621.00, 4106.29338717, N, 02901.18386180, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
$GPGGA, 142622.00, 4106.29339273, N, 02901.18387863, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
$GPGGA, 142623.00, 4106.29339566, N, 02901.18386326, E, 5, 06, 7.2, 103.3\par
$SDDBT, 1.3, f, 0.3, M, 0.2, F*05\par
\par
.
.
.
我在行尾遇到问题 \par,因为我无法读取值 103.3 而且我无法让程序使用混合变量同时读取 2 行 2 行(跳过“\par”行)
这得到了 /par 的权限,但它不是格式化阅读。我不确定使用 "csvread or fscanf"
fid = fopen('filename','r+');
C = textscan(fid, '%s', 'Delimiter', '\n', 'CommentStyle', '\','headerlines',2);
C = C{:}; fclose(fid);
我不确定 textscan 是否能够读取每第 n 行,但我会使用 fgets 逐行读取您的文件:
% Initialize arrays
GPGGAArray = [];
SDDBTArray = [];
% open file
fid = fopen('filename','r+');
% Skip 2 header lines
currentLine = fgets(fid);
currentLine = fgets(fid);
while ischar(currentLine)
currentLine = fgets(fid);
if currentLine == -1
break;
end
% line with GPGGA
C1 = textscan(currentLine, '%s', 'Delimiter', ',');
currentLine = fgets(fid);
if currentLine == -1
break;
end
GPGGAArray = [GPGGAArray; [str2double(C1{1,1}{2}), str2double(C1{1,1}{3}), str2double(C1{1,1}{5}),...
str2double(C1{1,1}{7}), str2double(C1{1,1}{8}), str2double(C1{1,1}{9}), str2double(C1{1,1}{10}(1:end-4))]];
% line with SDDBT
C2 = textscan(currentLine, '%s', 'Delimiter', ',');
SDDBTArray = [SDDBTArray; [str2double(C2{1,1}{2}), str2double(C2{1,1}{4}), str2double(C2{1,1}{6}),...
str2double(C2{1,1}{7}(3:end-4))]];
% skip line with \par
currentLine = fgets(fid);
end
% Close file
fclose(fid);
请注意,C1 和 C2 是包含字符串的元胞数组。