2013-11-14 47 views
0

我有一個格式類似於以下之一的CSV文件:Matlab的 - 預處理CSV文件

title1 
index columnA1 columnA2 columnA3 
1  2   3   6 
2  23  23  1 
3  2   3   45 
4  2   2   101 
title2 
index columnB1 columnB2 columnB3 
1  23  53  6 
2  22  13  1 
3  5   4   43 
4  8   6   102 

我想建立一個功能readCustomCSV其接收在所述波紋管示出的格式的CSV文件和一個行索引i並返回一個輸出文件(假設i = 3)以下內容:

title1 
index columnA1 columnA2 columnA3 
3  2   3   45 
title2 
index columnB1 columnB2 columnB3 
3  5   4   43 

你知道如何使用csvread功能,以獲得此類型的功能?

它讓我困惑,有兩種類型的部分。我正在考慮將整個事件作爲一個字符串使用,然後將其分割成2個.csv文件,然後讀取相應的行。

+0

請注意'csvread'要求CSV文件包含純數字數據。看看[這個問題](http://stackoverflow.com/questions/4747834/matlab-import-csv-file-with-mixed-data-types)。最高和可接受的答案爲您提供了一個函數'read_mixed_csv',它可以讓您將整個CSV文件作爲單元格矩陣導入。 –

回答

1

嘗試使用此功能: 我認爲所有的表格都有相同數量的列/行。代碼絕對可以縮短/改進/擴展;)

function multi_table_csvread (row_index) 
filename_INPUT = 'multi_table.csv' ; 
filename_OUTPUT = 'selected_row.csv' ; 
fIN = fopen(filename_INPUT,'r'); 
nextLine = fgetl(fIN); 
tableIndex = 0; 
tableLine = 0; 
csvTable = []; 
% start reading the csv file, line by line 
while nextLine ~= -1 
    lineStr = strtrim(strsplit(nextLine,',')) ; 
    % remove empty cells 
    lineStr(cellfun('isempty',lineStr)) = [] ; 
    tableLine = tableLine + 1 ; 
    % if 1 element start new table 
    if numel(lineStr) == 1 
     tableIndex = tableIndex + 1; 
     tableLine = 1; 
     csvTable{tableIndex,tableLine} = lineStr ; 
    else 
     lineStr = add_comas(lineStr) ; 
     csvTable{tableIndex,tableLine} = lineStr ; 
    end 
    nextLine = fgetl(fIN); 
end 
fclose(fIN); 
fOUT = fopen(filename_OUTPUT,'w'); 
if row_index > size(csvTable,2) -2 
    error('The row index exceeds the maximum number of rows!') 
end 
for k = 1 : size(csvTable,1) 
    title = csvTable{k,1}; 
    columnHeaders = csvTable{k,2}; 
    selected_row = csvTable{k,row_index+2}; 
    fprintf(fOUT,'%s\n',title{:}); 
    fprintf(fOUT,'%s',columnHeaders{:}); 
    fprintf(fOUT,'\n'); 
    fprintf(fOUT,'%s',selected_row{:}); 
    fprintf(fOUT,'\n'); 
end 
fclose(fOUT); 

function line_with_comas = add_comas(this_line) 

for ii = 1 : length(this_line)-1 
    this_line{ii} = strcat(this_line{ii},',') ; 
end 
line_with_comas = this_line ;