please help me read a csv file

1 次查看(过去 30 天)
i cannot read files using csvread or dlmread
  1 个评论
Jan
Jan 2014-4-22
"Cannot" is not a sufficient description of the occurring problems. Please post your code and show us the error messages or explain the difference between your expectations and the results.

请先登录,再进行评论。

采纳的回答

Friedrich
Friedrich 2014-4-22
Hi,
maybe consider using
>>uiimport
and let MATLAB do the job for you. You can generate M-Code for reading in the data, e.g.
%%Import data from text file.
% Script for importing data from the following text file:
%
% C:\Users\fhempel\Desktop\tmp\01012013.CSV
%
% To extend the code to different selected data or a different text file,
% generate a function instead of a script.
% Auto-generated by MATLAB on 2014/04/22 11:37:26
%%Initialize variables.
filename = 'C:\Users\fhempel\Desktop\tmp\01012013.CSV';
delimiter = ',';
%%Read columns of data as strings:
% For more information, see the TEXTSCAN documentation.
formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]';
%%Open the text file.
fileID = fopen(filename,'r');
%%Read columns of data according to format string.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false);
%%Close the text file.
fclose(fileID);
%%Convert the contents of columns containing numeric strings to numbers.
% Replace non-numeric strings with NaN.
raw = repmat({''},length(dataArray{1}),length(dataArray)-1);
for col=1:length(dataArray)-1
raw(1:length(dataArray{col}),col) = dataArray{col};
end
numericData = NaN(size(dataArray{1},1),size(dataArray,2));
for col=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,22,23,27]
% Converts strings in the input cell array to numbers. Replaced non-numeric
% strings with NaN.
rawData = dataArray{col};
for row=1:size(rawData, 1);
% Create a regular expression to detect and remove non-numeric prefixes and
% suffixes.
regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
try
result = regexp(rawData{row}, regexstr, 'names');
numbers = result.numbers;
% Detected commas in non-thousand locations.
invalidThousandsSeparator = false;
if any(numbers==',');
thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';
if isempty(regexp(thousandsRegExp, ',', 'once'));
numbers = NaN;
invalidThousandsSeparator = true;
end
end
% Convert numeric strings to numbers.
if ~invalidThousandsSeparator;
numbers = textscan(strrep(numbers, ',', ''), '%f');
numericData(row, col) = numbers{1};
raw{row, col} = numbers{1};
end
catch me
end
end
end
%%Split data into numeric and cell columns.
rawNumericColumns = raw(:, [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,22,23,27]);
rawCellColumns = raw(:, [1,2,19,20,21,24,25,26]);
%%Replace non-numeric cells with NaN
R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),rawNumericColumns); % Find non-numeric cells
rawNumericColumns(R) = {NaN}; % Replace non-numeric cells
%%Allocate imported array to column variable names
DATE = rawCellColumns(:, 1);
TIME = rawCellColumns(:, 2);
TEMP = cell2mat(rawNumericColumns(:, 1));
RH = cell2mat(rawNumericColumns(:, 2));
WDIR = cell2mat(rawNumericColumns(:, 3));
WSPEED = cell2mat(rawNumericColumns(:, 4));
RAINFALL = cell2mat(rawNumericColumns(:, 5));
APRESSURE = cell2mat(rawNumericColumns(:, 6));
SRAD = cell2mat(rawNumericColumns(:, 7));
EVAP = cell2mat(rawNumericColumns(:, 8));
AN1 = cell2mat(rawNumericColumns(:, 9));
AN2 = cell2mat(rawNumericColumns(:, 10));
AN3 = cell2mat(rawNumericColumns(:, 11));
AN4 = cell2mat(rawNumericColumns(:, 12));
DIG1 = cell2mat(rawNumericColumns(:, 13));
DIG2 = cell2mat(rawNumericColumns(:, 14));
DIG3 = cell2mat(rawNumericColumns(:, 15));
DIG4 = cell2mat(rawNumericColumns(:, 16));
PV = rawCellColumns(:, 3);
BAT = rawCellColumns(:, 4);
ACV = rawCellColumns(:, 5);
LAT = cell2mat(rawNumericColumns(:, 17));
LON = cell2mat(rawNumericColumns(:, 18));
ALTI = rawCellColumns(:, 6);
ELEVATION = rawCellColumns(:, 7);
DEVICEINFO = rawCellColumns(:, 8);
CHECKSUM = cell2mat(rawNumericColumns(:, 19));
%%Clear temporary variables
clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawData row regexstr result numbers invalidThousandsSeparator thousandsRegExp me rawNumericColumns rawCellColumns R;

更多回答(2 个)

Niklas Nylén
Niklas Nylén 2014-4-22
You can also try with importdata

Image Analyst
Image Analyst 2014-4-22
If you have R2013b or later, try readtable:
t = readtable('01012013.csv');
readtable() is able to handle numeric and non-numeric data on the same line.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by