String Matlab:将单元格字符串(逗号分隔)转换为向量

String Matlab:将单元格字符串(逗号分隔)转换为向量,string,matlab,vector,double,type-conversion,String,Matlab,Vector,Double,Type Conversion,我有一个巨大的csv文件(比如:不止几份文件),我想在Matlab中阅读并处理每个文件。完整读取文件是不可能的,因此我使用以下代码读取每一行: fileName = 'input.txt'; inputfile = fopen(fileName); while 1 tline = fgetl(inputfile); if ~ischar(tline) break end end fclose(inputfile); 这将生成一个大小为(1,1)的单元

我有一个巨大的csv文件(比如:不止几份文件),我想在Matlab中阅读并处理每个文件。完整读取文件是不可能的,因此我使用以下代码读取每一行:

fileName = 'input.txt';
inputfile = fopen(fileName);

while 1
    tline = fgetl(inputfile);
    if ~ischar(tline)
        break
    end
end
fclose(inputfile); 
这将生成一个大小为(1,1)的单元格数组,其中行为字符串。我想把这个单元格转换成一个普通的数组,只包含数字。 例如:

input.csv:
0.0,0.0,3.201,0.192
2.0,3.56,0.0,1.192
0.223,0.13,3.201,4.018
Matlab中第一行的最终结果:

A = [0.0,0.0,3.201,0.192]
我尝试用double(tline)转换tline,但这会产生完全不同的结果。还尝试使用正则表达式,但被卡住了。我将所有值拆分为一个数组中的不同单元格。但是用str2double转换成double只会产生NaNs

有什么建议吗?最好没有任何循环,因为读取整个文件已经需要一段时间。

试试看

data = dlmread('input.txt',',')
它会做你想做的事情

如果仍要将字符串转换为向量:

line_data = sscanf(line,'%g,',inf)
此代码将读取整个字符串并转换每个数字。

请重试

data = dlmread('input.txt',',')
它会做你想做的事情

如果仍要将字符串转换为向量:

line_data = sscanf(line,'%g,',inf)

此代码将读取整个字符串并转换每个数字。

您正在查找的
str2num

>> A = '0.0,0.0,3.201,0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0 0.0 3.201 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0     0.0 ,    3.201 , 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
e、 输入格式是不可知的

然而,对于您的用例,我不建议这样做。对于你的问题,我愿意

C = dlmread('input.txt',',', [1 1 1 inf]) % for first line
C = dlmread('input.txt',',')              % for entire file

如果希望所有列都包含在单独的变量中:

a = 0
b = 0
c = 3.201
d = 0.192


所有这些都更容易扩展(像这样的东西,不管它们是什么,都会随着时间的推移变得更大:)。尤其是
dlmread
比编写自己的子句更不容易出错,因为空行、缺少值和其他在大多数数据集中非常常见的大麻烦

您正在寻找
str2num

>> A = '0.0,0.0,3.201,0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0 0.0 3.201 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0     0.0 ,    3.201 , 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
e、 输入格式是不可知的

然而,对于您的用例,我不建议这样做。对于你的问题,我愿意

C = dlmread('input.txt',',', [1 1 1 inf]) % for first line
C = dlmread('input.txt',',')              % for entire file

如果希望所有列都包含在单独的变量中:

a = 0
b = 0
c = 3.201
d = 0.192


所有这些都更容易扩展(像这样的东西,不管它们是什么,都会随着时间的推移变得更大:)。尤其是
dlmread
比编写自己的子句更不容易出错,因为空行、缺少值和其他在大多数数据集中非常常见的大麻烦

您是否尝试过将
范围
参数指定为CSV读取?请使用
str2num(tline)
而不是
str2double
。在这个文件交换项中,有一些关于在MATLAB中处理大型数据集的好建议。您是否尝试过将
范围
参数指定为CSV读取?请使用
str2num(tline)
而不是
str2double
。在这个文件交换项中,有一些关于在MATLAB中处理大型数据集的好建议。这似乎是我问题的完美答案,但是,我无法让'inf'参数工作。。。它给出了一个错误:中冒号运算符的非有限端点或增量index@Tim:呜呜,看来我测试得不够彻底。我现在没有机会,但是你能试试
C=dlmread('input.txt',',','1)
?(即,没有向量)或
C=dlmread('input.txt',',',',1:10)
(前10行,希望:)我尝试了这两种方法,但都不起作用。我通过手动指定columnrange修复了它,因为我从另一个矩阵知道这一点(尽管这当然不是很模块化)。我还可以通过捕捉每一行来读取文件(因为我不知道行的范围)。这似乎是我问题的完美答案,但是,我无法让'inf'参数工作。。。它给出了一个错误:中冒号运算符的非有限端点或增量index@Tim:呜呜,看来我测试得不够彻底。我现在没有机会,但是你能试试
C=dlmread('input.txt',',','1)
?(即,没有向量)或
C=dlmread('input.txt',',',',1:10)
(前10行,希望:)我尝试了这两种方法,但都不起作用。我通过手动指定columnrange修复了它,因为我从另一个矩阵知道这一点(尽管这当然不是很模块化)。我还可以通过捕捉每一行来读取文件,以捕捉文件的结尾(因为我不知道行的范围)。