读取 .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 );
关于您的代码,您有两个主要错误
D = a(i)+numbers;
- 你实际上在每次迭代时覆盖 D
。尝试 D(i,:) = a(i,:)+numbers;
而不是
i=i+1;
- 你改变了循环内的循环变量!如果您在 i
上使用 for
循环,则无需手动增加它。
还有一些评论:
最好not to use i
as a variable name in Matlab.
您预分配了 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
您好,我在一个文本文件中有这些数据,我想读取其中的数据。
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 );
关于您的代码,您有两个主要错误
D = a(i)+numbers;
- 你实际上在每次迭代时覆盖D
。尝试D(i,:) = a(i,:)+numbers;
而不是i=i+1;
- 你改变了循环内的循环变量!如果您在i
上使用for
循环,则无需手动增加它。
还有一些评论:
最好not to use
i
as a variable name in Matlab.您预分配了
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