导入许多csv文件

时间:2015-03-03 08:36:21

标签: r matlab matrix

我有一个满是' N'大小(m,n)的.csv文件数。我想导入它们,同时将每个文件转换为大小为(mxn)的列矩阵,并将它们存储在(mxn,N)大小矩阵中,每列都有相应文件的名称。

我的代码无法从.csv文件中检索数据并显示错误。这些数据是每月平均降雨量数据,有13列(年,1月,1月......),我不想导入年份列,因为它没有降雨值而只是年值。

我的代码是

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编程语言中的任何回复都是可以接受的。

1 个答案:

答案 0 :(得分:0)

如果查看csvread文档,则表明该文件必须仅包含数值。由于您的文件包含其他数据类型(如字符串),因此可以使用textscan(有关详细信息,请参阅文档)。

在stackoverflow中查看此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', ',');

可以轻松修改该功能以满足您的需求。希望它有所帮助