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

Read (m x n) comma separated lines of a .txt file

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

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。数据每次都被替换。有人可以帮我吗?

您是否考虑过使用 csvread

D = csvread( filename );

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

  1. D = a(i)+numbers; - 你实际上在每次迭代时覆盖 D 。尝试 D(i,:) = a(i,:)+numbers; 而不是

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

还有一些评论:

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

  2. 您预分配了 a 但没有预分配 D,请考虑预分配 D

你已经说过了:每次都替换D。发生这种情况是因为您在访问 D 时没有指定索引。您应该做类似

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

但正如 Shai 指出的那样,对于您的问题可能有更简单的解决方案。

假设您的文件如下所示:

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 header 行,分隔符是 ','。现在只需使用 importdata 作为一个非常方便的导入函数:

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

哪个returns:

X = 

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

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

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

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

行偏移设置为 4 的备选方案 suggested by Shai using csvread 也可以完成这项工作。但请注意 缺失值被替换为零 ,我个人不喜欢进一步处理数据。特别是因为您的实际数据也包含零。

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

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

while ~(Ligne==-1)

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

end