如何将多行完整的文本解析为八度“矩阵”

时间:2019-06-06 15:56:41

标签: octave

我想从多个子文件中的多个文件中导入大量数据。幸运的是,数据在其输出中是一致的:

Subpro1/data apples 1 
Subpro1/data oranges 1 
Subpro1/data banana 1 

然后

Subpro2/data apples 1 
Subpro2/data oranges 1 
Subpro2/data banana 1 

我想拥有一个datafilename数组,该数组包含我需要读取的每组数据的文件名。然后,我可以提取数据并将其存储在一个更本地的文件中,进行处理,最后将“ sub1_apples”与“ sub2_apples”进行比较

我尝试过

fid = fopen ("DataFileNames.txt");
DataFileNames = fgets (fid)
fclose (fid);

但这只给了我7的第一行。

DataFileNames = dlmread('DataFileNames.txt')给了我一个7x3数组,但是每行只有0 0 1,因为它读取名称分隔符,但不能更改文件名。

DataFileNames = textread("DataFileNames.txt", '%s') 拥有所有正确的信息,但分隔符仍将其分成多行

data
apples
1
data
oranges
1 
...

是否有%?我很想念,如果是的话,那是什么?

我希望输出为:

data apples 1 
data oranges 1 
data banana 1 

带有空格,下划线和包括的所有内容,以便随后可以使用它来访问数据文件。

1 个答案:

答案 0 :(得分:2)

您可以将文件的所有行读取到像这样的单元格数组中:

str = fileread("DataFileNames.txt");
DataFileNames = regexp(str, '\r\n|\r|\n', 'split');

输出:

DataFileNames =
{
  [1,1] = data apples 1
  [1,2] = data oranges 1
  [1,3] = data banana 1
}

在您尝试的第一个选项中,使用fgets仅读取一行。另外,最好使用fgetl删除行尾。要逐行读取(较长),您需要执行以下操作:

DataFileNames = {};
fid = fopen ("DataFileNames.txt");
line = fgetl(fid);
while ischar(line)
    if ~isempty(line)
        DataFileNames = [DataFileNames line];
    endif
    line = fgetl(fid);
endwhile
fclose (fid);

您尝试使用第二个选项dlmread的效果不好,因为它用于将数字数据读取到矩阵中。

您尝试使用textread的第三个选项不是很好,因为它对所有空白(空格,行尾,...)均等对待