我有一個資料檔案,其中包含我試圖讀入 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);
一定有更好的方法...
uj5u.com熱心網友回復:
我看到上面有一個 matlab 標簽,你使用的是 matlab textscan 還是 octave?
如果在 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' }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426543.html
