如何将文本字段读入MATLAB并创建单个矩阵

如何将文本字段读入MATLAB并创建单个矩阵,matlab,file-io,matrix,Matlab,File Io,Matrix,我有一个巨大的CSV文件,它混合了数字和文本数据类型。我想把它读入Matlab中的一个矩阵。我将用一个更简单的例子来说明我的问题。假设我有这个CSV文件: 1,foo 2,bar 我试图使用以下方法将其读入MatLab: A=fopen('filename.csv'); B=textscan(A,'%d %d', 'delimiter',','); C=cell2mat(B); 前两行工作正常,但问题是texscan没有创建2x2矩阵;相反,它创建一个1x2矩阵,每个值都是一个数组。因此,我

我有一个巨大的CSV文件,它混合了数字和文本数据类型。我想把它读入Matlab中的一个矩阵。我将用一个更简单的例子来说明我的问题。假设我有这个CSV文件:

1,foo
2,bar
我试图使用以下方法将其读入MatLab:

A=fopen('filename.csv');
B=textscan(A,'%d %d', 'delimiter',',');
C=cell2mat(B);
前两行工作正常,但问题是texscan没有创建2x2矩阵;相反,它创建一个1x2矩阵,每个值都是一个数组。因此,我尝试使用最后一行将数组组合成一个大矩阵,但它会产生错误,因为数组具有不同的数据类型


有办法解决这个问题吗?还是一种更好的组合阵列的方法?

我认为您不能使用textscan来实现此目的。我会使用fscanf,它总是给你指定的矩阵。但是,如果您不知道数据的布局,它会变得有点棘手

fscanf的工作如下:

fscanf(fid, format, size)
其中fid是fopen生成的fid

format是文件格式&您读取数据的方式(['%d','%s']适用于您的示例文件)


size是矩阵维度([2]适用于您的示例文件)。

我确信组合它们是个好主意。如果他们分开,你可能会过得更好

我更改了您的代码,以便更好地工作:

clear
clc
A=fopen('filename.csv');
B=textscan(A,'%d %s', 'delimiter',',')
fclose(A)
看看结果

K> >B{1}

ans=

K> >B{2}

ans=

'foo'
'bar'
真的,我认为这是最有用的格式。如果有什么不同的话,大多数人都希望将这个单元数组分解成更小的块

num = B{1}
txt = B{2}

你为什么要把它们结合起来?它们已经在一个单元格数组中组合在一起,这是您将要得到的最组合。

对此有一个自然的解决方案,但它需要统计工具箱(6.0版或更高版本)。可以将混合数据类型读入数据集数组。请参阅Mathworks帮助页面。

我将它们结合起来,以创建一个矩阵,作为OLS回归中的因变量。我有许多文本字段需要转换为伪变量(例如,表示“true”或“false”的字段将转换为1或0)。我计划将文本粘贴到矩阵中,然后遍历它并在必要时转换字段。但是根据你的建议,也许最好在它们仍然在数组中时转换它们,然后合并它们?转换完所有内容后,是否建议使用cell2mat进行合并?谢谢你,道格!您可能希望将它们保存在一个结构中:data.num=num data.txt=txt这将把它们保存在一个容器中,并让您将它们称为更直观的名称。将它们放在一个单元格数组中只会使读取和操作它们的语法更加困难,除了组合它们之外没有其他好处。我会选择这个结构。@Jack7890:如果您真的想将各个数组组合成一个矩阵,那么首先必须将所有数组内容转换为相同的数据类型。例如,假设存储在B{2}中的数组['foo';'bar']变成了[3;4]。要将数组水平连接到[13;24],请执行以下操作:C=[B{:}];要将数组垂直连接到[1;2;3;4],请执行以下操作:C=vertcat(B{:});非常感谢你们的帮助。还有一个简单的问题:为什么textscan()返回存储在单个单元格中的向量,我感到困惑。我一直在通过对它返回的所有向量使用cell2mat()来解决这个问题,因此向量被存储为K-by-1矩阵,但我担心我在这里遗漏了一些东西。textscan()不自动将内容存储在K-x-1矩阵中有什么原因吗?我的方法有问题吗?
num = B{1}
txt = B{2}