我有一个满是' 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编程语言中的任何回复都是可以接受的。
答案 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', ',');
可以轻松修改该功能以满足您的需求。希望它有所帮助