2015-03-03 150 views
0

我有一個文件夾充滿'N'個大小爲(m,n)的.csv文件。我想導入它們,同時將每個文件轉換爲一個大小爲(mxn)的列矩陣,並將它們存儲在一個(mxn,N)大小的矩陣中,每列都有相應文件的名稱。導入許多csv文件

我的代碼無法從.csv文件中檢索數據並顯示錯誤。這些數據是一個月平均降雨量數據,有13列(年,jan,feb ...... dec),我不想輸入年份列,因爲它沒有降雨值而只是年份值。

我的代碼是

list=dir('*.csv'); 
N=numel(list); 
h=zeros(1300,N); 
for k =1:1:N; 
    data=csvread(list(k).name); 
    M=size(data); 
    for j=1:M(1) 
     for i=1:M(1) 
      h(i+1+(j-1)*12,k)=data(j,i); 
     end 
    end 
end 

這裏h是我想要存儲的所有數據的矩陣。

Error using dlmread (line 138) 
Mismatch between file and format string. 
Trouble reading number from file (row 1u, field 1u) ==> "Year" "Jan" "Feb" 
"Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"\n 

雖然上面的代碼是在matlab中,但在R編程語言中的任何回覆也是可以接受的。

+0

R中的工作流已經被描述了很多次。請按照「導入多個文件」的方式進行搜索。爲了縮小它,你需要函數'list.files()','do.call()',當然還有'read.table()'或者它的任何變體。 – 2015-03-03 08:45:57

+0

'csvread'僅用於數字數據。你必須使用另一個函數來讀入,例如這樣:http://stackoverflow.com/questions/6759657/reading-text-data-from-a-csv-file-in-matlab – Daniel 2015-03-03 08:48:51

+0

可能的重複[Import具有混合數據類型的CSV文件](http://stackoverflow.com/questions/4747834/import-csv-file-with-mixed-data-types) – Daniel 2015-03-03 08:53:49

回答

0

如果您查看csvread文檔,它指出該文件必須只包含數字值。由於您的文件包含其他數據類型(如字符串),因此您可以使用textscan(有關更多詳細信息,請參閱文檔)。

請看這個thread的計算器。已使用使用textscan和fgetl的自定義函數來讀取混合數據類型的csv文件。下面的代碼取自上面提到的線程。代碼已在gnovice所寫的答案中提供。

function lineArray = read_mixed_csv(fileName,delimiter) 
    fid = fopen(fileName,'r'); %# Open the file 
    lineArray = cell(100,1);  %# Preallocate a cell array (ideally slightly 
           %# larger than is needed) 
    lineIndex = 1;    %# Index of cell to place the next line in 
    nextLine = fgetl(fid);  %# Read the first line from the file 
    while ~isequal(nextLine,-1)   %# Loop while not at the end of the file 
    lineArray{lineIndex} = nextLine; %# Add the line to the cell array 
    lineIndex = lineIndex+1;   %# Increment the line index 
    nextLine = fgetl(fid);   %# Read the next line from the file 
    end 
    fclose(fid);     %# Close the file 
    lineArray = lineArray(1:lineIndex-1); %# Remove empty cells, if needed 
    for iLine = 1:lineIndex-1    %# Loop over lines 
    lineData = textscan(lineArray{iLine},'%s',... %# Read strings 
         'Delimiter',delimiter); 
    lineData = lineData{1};    %# Remove cell encapsulation 
    if strcmp(lineArray{iLine}(end),delimiter) %# Account for when the line 
     lineData{end+1} = '';      %# ends with a delimiter 
    end 
    lineArray(iLine,1:numel(lineData)) = lineData; %# Overwrite line data 
    end 
end 

運行的功能很簡單,只要

data_csv = read_mixed_csv('filename.csv', ','); 

的功能可以很容易地修改,以滿足您的需求。希望它有幫助