如何使用引号之间的逗号读取带有某些值的逗号分隔数据



我有一个数据文件,其中包括我试图读取到Octave中的逗号分隔数据。大多数数据都很好,但有些数据包含双引号之间的数字,引号之间使用逗号。以下是数据的示例部分:

.123,4.2,"4,123",700,12pie
.34,4.23,602,701,23dj
.4345,4.6,"3,623,234",700,134nfg
.951,68.5,45,699,4lkj

我一直在使用textscan读取数据(因为它混合了数字和字符串(,指定逗号分隔符,这在大多数情况下都有效,但偶尔文件会在该列中的引号中包含这些更大的整数。我能够绕过数据文件中早些时候引用的其中一个数字,因为我知道它会在哪里,但它并不漂亮:

sclose = textscan(fid, '%n %n', 1, 'delimiter', ',');
junk = fgetl(fid, 1);
junk = textscan(fid, '%s', 1, 'delimiter', '"');
junk = fgetl(fid, 1);
sopen = textscan(fid, '%n %s', 1, 'delimiter', ',');

我不在乎那一列中的数据,但因为它会改变大小,有时还会包含我想忽略的带引号的数据,我很难阅读/跳过它。关于如何处理它,有什么建议吗?

这是我当前的(丑陋的(方法,它将列读取为字符串,然后使用strfind来检查";在字符串中。如果它存在,则它读取另一个逗号分隔的字符串并重复检查;然后继续读取数据。

fid = fopen('sample.txt', 'r');
for k=1:4
expdata1(k, :) = textscan(fid, '%n %n %s', 1, 'delimiter', ',');  #read first 3 data pts
qcheck = char(expdata1(k,3));
idx = strfind(qcheck, '"');  #look for "
dloc = ftell(fid);
for l=1:4
if isempty(idx) #if no " present, continue reading data
break
endif
dloc = ftell(fid);  #save location so can return to next data point
expdata1(k, 3) = textscan(fid, '%s', 1, 'delimiter', ',');  #if " present, read next comma segment and check for "
qcheck = char(expdata1(k,3));
idx = strfind(qcheck, '"');
endfor
fseek(fid, dloc);
expdata2(k, :) = textscan(fid, '%n %s', 1, 'delimiter', ',');
endfor
fclose(fid);

一定有更好的方法。。。

我看到上面有一个matlab标签,你用的是matlab textscan还是倍频程?

如果在matlab中,我建议使用readmatrix或readtable。

还要注意,带引号字符串的格式说明符是%q。这应该适用于两种语言,甚至适用于textscan

将您的样本数据放入data.csv中,可能会出现以下情况:

>> readtable("data.csv", 'Format','%f%f%q%d%s');
ans =
4×5 table
Var1     Var2        Var3         Var4       Var5   
______    ____    _____________    ____    __________
0.123     4.2    {'4,123'    }    700     {'12pie' }
0.34    4.23    {'602'      }    701     {'23dj'  }
0.4345     4.6    {'3,623,234'}    700     {'134nfg'}
0.951    68.5    {'45'       }    699     {'4lkj'  }

相关内容

  • 没有找到相关文章

最新更新