读取(m x n)逗号分隔的.txt文件行

时间:2015-03-30 08:06:32

标签: matlab file-io

您好我在文本文件中有这些数据,我想读取其中的数据。

2003,04,15,15,15,00,38.4279,-76.61,1565,3.7,0.0,38.19,-999,-999,3.9455,3.1457,2.9253

2003,04,15,16,50,00,38.368,-76.5,1566,3.7,0.0,35.01,-999

2003,04,15,17,50,00,38.3074,-76.44

我使用了以下代码:

a= zeros(4460,216);
nl = a(:,1);
nc = a(1,:); 

if fid>0
  for i = 1:length(nl)
    d = textscan(Ligne,'%f','whitespace',',');
    numbers = d{:}';    
    D = a(i) + numbers;
    i = i+1;
  end
  Ligne = fgetl(fid);
end

问题在于我无法实现矩阵D.每次都要替换数据。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:2)

假设您的文件如下:

Header
Header
Header

2003,04,15,15,15,00,38.4279,-76.61,1565,3.7,0.0,38.19,-999,-999,3.9455,3.1457,2.9253

2003,04,15,16,50,00,38.368,-76.5,1566,3.7,0.0,35.01,-999

2003,04,15,17,50,00,38.3074,-76.44

在示例中,您有 4 标题,分隔符为 ',' 。现在只需使用importdata作为一个非常方便的导入函数:

X = importdata('myData.txt',',',4)

返回:

X = 

          data: [3x17 double]
      textdata: {4x17 cell}
    colheaders: {1x17 cell}

X.data包含您的数字数据。由于文件中的数据在每一行中都有不同数量的条目,因此缺少的值会被NaN 填充。 X.textdata包含跳过的标题行作为字符串。

如果需要,您可以使用textscan处理它们:

additionalInformation = textscan(X.textdata, ... )

使用suggested by Shai并且行偏移设置为 4 的替代csvread也可以完成此任务。但请注意,缺失值将替换为零,这是我个人不喜欢进一步处理数据的原因。特别是因为您的实际数据还包含零。

X = csvread('myData.txt',4)

答案 1 :(得分:0)

您是否考虑过使用csvread

D = csvread( filename );

关于您的代码,您有两个主要错误

  1. D = a(i)+numbers; - 您实际上在每次迭代时覆盖D。请尝试使用D(i,:) = a(i,:)+numbers;

  2. i=i+1; - 你改变循环中的循环变量!如果您在for上使用i - 循环,则无需手动递增。

  3. 还有一些评论:

    1. 最好是not to use i as a variable name in Matlab

    2. 您预先分配了a但未D,请考虑预先分配D

答案 2 :(得分:0)

你已经说过了:每次都更换D.这是因为您在访问D时未指定索引。您应该执行类似

的操作
D = zeros(size(a))
....
if ...
  for ... 
    ...
    D(i) = a(i) + numbers;
    ...
  end
end

但正如Shai指出的那样,你的问题可能会有一个更简单的解决方案。

答案 3 :(得分:0)

最后我使用了这些代码行。         D = NaN(大小(a));         I = 1;

while ~(Ligne==-1)

    d = textscan(Ligne,'%f','whitespace',',');
    numbers = d{:}';    
    D(i,:) = numbers;
    Ligne = fgetl(fid);
    i=i+1;

end