gpt4 book ai didi

parsing - 导入包含混合数据类型的 CSV 文件

转载 作者:太空宇宙 更新时间:2023-11-03 19:05:57 28 4
gpt4 key购买 nike

我使用 MATLAB 工作了几天,但在将 CSV 文件导入矩阵时遇到困难。

我的问题是我的 CSV 文件几乎只包含字符串和一些整数值,因此 csvread() 不起作用。 csvread() 只接受整数值。

如何将我的字符串存储在某种二维数组中以便可以自由访问每个元素?

这是满足我需要的示例 CSV:

04;abc;def;ghj;klm;;;;;
;;;;;Test;text;0xFF;;
;;;;;asdfhsdf;dsafdsag;0x0F0F;;

主要是空单元格和单元格内的文本。如您所见,结构可能有所不同。

最佳答案

如果您知道 CSV 文件中将有多少列数据,只需调用 textscan喜欢Amro suggests将是您最好的解决方案。

但是,如果您先验不知道文件中有多少列,您可以使用更通用的方法,就像我在以下函数中所做的那样。我首先使用了函数 fgetl将文件的每一行读入元胞数组。然后我使用了函数 textscan使用预定义的字段分隔符将每一行解析为单独的字符串,并将整数字段暂时视为字符串(稍后可以将它们转换为数值)。这是生成的代码,放在函数 read_mixed_csv 中:

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 = read_mixed_csv('myfile.csv', ';')

data =

Columns 1 through 7

'04' 'abc' 'def' 'ghj' 'klm' '' ''
'' '' '' '' '' 'Test' 'text'
'' '' '' '' '' 'asdfhsdf' 'dsafdsag'

Columns 8 through 10

'' '' ''
'0xFF' '' ''
'0x0F0F' '' ''

结果是一个 3×10 元胞数组,每个元胞有一个字段,其中缺少的字段由空字符串 '' 表示。现在您可以访问每个单元格或单元格组合以根据需要设置它们的格式。例如,如果您想将第一列中的字段从字符串更改为整数值,您可以使用函数 str2double如下:

>> data(:, 1) = cellfun(@(s) {str2double(s)}, data(:, 1))

data =

Columns 1 through 7

[ 4] 'abc' 'def' 'ghj' 'klm' '' ''
[NaN] '' '' '' '' 'Test' 'text'
[NaN] '' '' '' '' 'asdfhsdf' 'dsafdsag'

Columns 8 through 10

'' '' ''
'0xFF' '' ''
'0x0F0F' '' ''

请注意,空字段会导致 NaN值(value)观。

关于parsing - 导入包含混合数据类型的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747834/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com