2011-12-07 11 views
11

से केवल हेडर लाइन पढ़ें, मान लें कि पहले पंक्ति में चर नामों और निम्न संख्याओं में दशमलव संख्या वाले myfile.csv हैं। Matlab में मैं हेडर लाइन और दशमलव संख्या अलग से पढ़ना चाहता हूं। अब तक, मैं शीर्ष लेख पंक्ति को निकालने के लिए निम्नलिखित कर रहा हूँ:मैटलैब: .csv-file

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s','Delimiter','\n'); 
b = a{1,1}; 
fclose(fid); 
c = textscan(b,'%s','Delimiter',','); 
d = c{1} 

फिर, मैं csvread आदेश का उपयोग फ़ाइल के संख्यात्मक भाग निकालने के लिए। लेकिन ऐसा करने के लिए एक (बहुत) आसान तरीका होना चाहिए! सबसे पहले, मैं केवल पहली पंक्ति निकालने के लिए पूरी फ़ाइल (a = textscan(fid,'%s','Delimiter','\n'); के साथ) नहीं पढ़ना चाहता हूं। दूसरा, ऐसा करने के लिए कोड की 7 लाइनों का उपयोग करना गलत लगता है - क्या इसे कम से कम किया जा सकता है?

मैं किसी भी रचनात्मक सुझावों के लिए आभारी हूं।

+0

लाइन 3. के लिए धन्यवाद इसके अलावा, यह बेहतर इस तरह :) – skip

उत्तर

3

ओपन fopen साथ फ़ाइल,, textscan साथ शीर्ष लेख पंक्ति पढ़ fscanf साथ दशमलव संख्या पढ़ा है, और अंत में fclose कहते हैं - कुल :) उदाहरण इनपुट फ़ाइल में केवल 4 लाइनों:

Weight,Size,Count 
1,2,3 
4,5,6 
7,8,9 
10,11,12 

पढ़ना इस फ़ाइल की:

fid = fopen('myfile.csv', 'r'); 
header = textscan(fid, '%[^,],%[^,],%[^,\r\n]', 1); 
data = transpose(fscanf(fid, '%g,%g,%g\n', [3, Inf])); 
fclose(fid); 

for i = 1 : 3; disp(['"' cell2mat(header{i}) '"']); end; 
disp(data); 

ध्यान दें कि डेटा fscanf द्वारा पढ़ा स्थानांतरित करने की आवश्यकता है (मैं बजाय transpose लेखन 012,349,623 से इस बात पर जोर दिया)। उत्पादन:

"Weight" 
"Size" 
"Count" 
    1  2  3 
    4  5  6 
    7  8  9 
    10 11 12 
+0

धन्यवाद एक बहुत लग रहा है! लेकिन क्या होगा यदि मैं कोड को अधिक सार्वभौमिक तरीके से लिखना चाहता था, जैसे कि इसे विभिन्न प्रकार के चर (3 के बजाए) फ़ाइलों के लिए इस्तेमाल किया जा सकता है, जब भी वेरिएबल्स की संख्या बदल जाती है, इसे फिर से लिखने के बिना? – skip

+1

उस स्थिति में मैं 'getl' के साथ हेडर लाइन पढ़ूंगा और कॉलम की संख्या प्राप्त करने के लिए इसे' स्ट्रोक 'के साथ पार्स करूँगा,' एनसी'। 'एनसी' निर्धारित करने के बाद, 'fscanf' की प्रारूप स्ट्रिंग को लूप का उपयोग करके इकट्ठा किया जा सकता है ('% g' के बीच कॉमा के साथ संयोजित करके), और इसका अंतिम पैरामीटर '[nc, inf]' पर सेट किया जा सकता है। । वैकल्पिक रूप से, आप संख्याओं को एक कॉलम में पढ़ सकते हैं ('[1 inf]' का उपयोग करके), और बाद में इसे दोबारा दोहराएं (पंक्तियों का संख्या: 'nr = length (डेटा (:))/nc;')। – kol

+0

पूरी तरह से जवाब के लिए धन्यवाद! – skip

1

पहली पंक्ति को निकालने के लिए, आप केवल जरूरत

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s',1); 
fclose(fid);