【问题标题】:Is there a way to combine columns from multiple text files into a single text file using Matlab?有没有办法使用 Matlab 将多个文本文件中的列组合成一个文本文件?
【发布时间】:2020-01-15 01:34:52
【问题描述】:

我正在使用 Matlab 将 4 个单独的文本文件中的列组合成 Matlab 中的一个新文本文件。每个文本文件具有相同的行数 (5478)。我在这里发现了类似的问题...

Read multiple text files and import each of them as columns

我从那个链接中接受了 Ray 的第二个建议,但它仍然没有奏效。我的代码如下所示...

 textDataMatrix = zeros(5478, 4);
 t = {'prec', 'rsds', 'tmax', 'tmin'};

  for k = 1:4
    Mead_NE_Climate_1985_1999 = [t{k} '_outfile_mead.txt'];
    fid = fopen(Mead_NE_Climate_1985_1999, 'rt');
    textData = fread(fid);
% Place the k'th text data in the k'th column
  textDataMatrix(:,k) = textData;
  fclose(fid);
 end  

由于某种原因,我收到以下错误...

下标分配维度不匹配。

Mead_Text_Climate 中的错误(第 10 行) textDataMatrix(:,k) = textData;

我已经目视检查了所有文本文件,它们每个都有相同数量的行/行。所以我很难理解为什么这不起作用。任何人都可以帮忙吗?谢谢你的时间! First few lines containing daily Precipitation Values

【问题讨论】:

  • 您能向我们展示您的文本文件吗?请把它们放在某个地方供我们查看。
  • 听起来像 textData = fread(fid) 并没有产生您想要的效果。你检查过它正在生产什么吗?
  • @MarkSnyder:你是对的。 textData 变成了一个 58819x1 矩阵,其中填充了我不认识的数字。 textData 中的数字是整数,与每个文本文件中的数字不同。所以我不确定为什么会这样。
  • @rayryeng-ReinstateMonica,感谢您的快速回复!我并没有真正使用谷歌云端硬盘,所以我希望这样可以访问文本文件...drive.google.com/open?id=1CEh6u680Sp5NCYGQJBxBoqtGJCW3ByVA

标签: matlab text


【解决方案1】:

尝试改用readmatrix。这个函数的好处是它可以处理NaN 值,这是你的一些文本文件所具有的。此外,由于您的文本文件有逗号,这会使函数混淆,并认为有第二个空列。只是子集到第一列是安全的。请注意,此功能存在于 2019a 或更高版本中:

textDataMatrix = zeros(5478, 4);
t = {'prec', 'rsds', 'tmax', 'tmin'};
for k = 1:4
    Mead_NE_Climate_1985_1999 = [t{k} '_outfile_mead.txt'];
    textData = readmatrix(Mead_NE_Climate_1985_1999);
    textDataMatrix(:,k) = textData(:,1);
end

【讨论】:

  • 当我使用 dlmread 时,我收到以下错误:“Assignment has more non-singleton rhs dimensions than non-singleton subscripts Error in Mead_Text_Climate (line 7) textDataMatrix(:,k) = textData;”在脚本停止之前,它显示 textData 是一个 5478x2 数组。第一列似乎正在从 prec txt 文件中读取正确的文本数据。但是,由于某种原因,它在 prec txt 文件和 rsds txt 文件之间挂起(第 2 列读取 0)。最初,第一个文本文件中的最后一个条目没有逗号,所以我添加了一个,但这没有帮助。有什么想法吗?
  • @AliKoleiny 如果您使用的是 MATLAB R2019a 或更高版本,您可以安全地使用readmatrixdlmreadfscanf 无法处理 NaN 值,但 readmatrix 可以。逗号也会抛出该函数,因为它认为还有第二列。您可以子集化并仅获取第一列。我已经编辑了我的帖子 - 请看一下。
  • 对不起,我现在才回复你,雷。不幸的是,我的版本是 R2017b。如果您有时间,您对我如何处理该版本中的 NaN 值有什么建议吗?另外,我不完全确定您所说的“您可以子集化并获得第一列”是什么意思。我假设这允许 MATLAB 忽略逗号。但我不确定“你可以如何设置子集”。任何额外的见解将不胜感激!
  • 我已经在上面的帖子中提到了如何做到这一点。不幸的是,我没有更多的空闲时间了。我要把这个留给别人。祝你好运。
【解决方案2】:

fread 将文件读取为二进制文件,即使您 fopen 您的文件处于文本模式。输出是字节向量(但存储为双精度)。 (见matlab doc for fread

相反,您想使用不同的方法将文件作为文本读取,例如fscanf

假设文件中的数据是浮点数(每行末尾有一个逗号),以下内容应该可以满足您的需求:

textDataMatrix = zeros(5478, 4);
t = {'prec', 'rsds', 'tmax', 'tmin'};

for k = 1:4
   Mead_NE_Climate_1985_1999 = [t{k} '_outfile_mead.txt'];
   fid = fopen(Mead_NE_Climate_1985_1999, 'rt');
   textData = fscanf(fid, '%f,');
   textDataMatrix(:,k) = textData;
   fclose(fid);
end

【讨论】:

  • Emrah,我使用 fscanf 而不是 fread 如你所建议的。当我这样做时,textDataMatrix(这是一个 5478x4 矩阵)从每个文本文件中获取第一行值,并为整个列的每个后续值重复它,对于每一列(文本文件)。出于某种原因,它只是重复了每个文本文件(在 textDataMatrix 中)中的第一个值,而不是正确添加每个单独文本文件中的剩余值。你知道为什么会这样吗?
  • 不幸的是,我不知道为什么它会在没有看到文件内容的情况下这样做。您可以在这里发布其中一个文件中的内容吗?不是全部 5000 多行,而是每个文件的前 5 行或其他什么?
  • 我在原始帖子的底部添加了一张图片。这些是第一个文本文件中的每日降水量值。不幸的是,我不得不离开我的笔记本电脑几个小时,但我应该可以稍后再回来查看。如果您很忙,请不要担心。你已经很有帮助了。感谢您的帮助!
  • 哦,问题是你的行最后有一个,,需要考虑到让fscanf 正常工作。我更新了我的答案以包含逗号,看看它现在是否适合你(fscanf 还应该正确处理使用 e 表示法具有值的行)
猜你喜欢
  • 2015-07-11
  • 2011-09-12
  • 2021-11-08
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多