为通用文件导入具有多个定界符的数据
Import Data with Multiple Delimiter for Generic Files
我需要将 space 和制表分隔数据导入到矩阵样式变量或结构中,但文件格式不同,不允许我选择 %f %s pre-formatted 函数作为一个解法。新列将被添加到另一个文件或从一个文件中删除,我什至不知道它们的类型。
Excel 显示非常适合我的数据,如果我将它作为文本文件打开并简单地同时选择 space 和制表作为其分隔符。
如果您知道是否有任何文件导入功能可以让我遵循Excel的做法或对如何解决我的问题有任何想法,请谈谈!
下面是所用文本的示例部分:
loggername date__________ time________ s1a[m/s] s1x[m/s] s1i[m/s] s1s[m/s] s2a[m/s] s2x[m/s] s2i[m/s] s2s[m/s] s3a[m/s] s3x[m/s] s3i[m/s] s3s[m/s] d1a[°] d1s[°] d2a[°] d2s[°] h1a[%] t1a[°C] b1a[hPa] s4a[m/s] s4x[m/s] s4i[m/s] s4s[m/s] vxa[V] bla[V] bra[V] [-1=error] [ser.no.]
TA-48 01/10/2015 00:00:00 5,8 7,1 4,9 0,4 5,7 7,3 4,8 0,4 4,9 5,8 4,1 0,3 161,0 7,0 167,0 8,0 81,0 24,65 1000,0 4,0 4,7 3,3 0,3 12,7 8,0 8,7 C120104
TA-48 01/10/2015 00:10:00 5,8 6,5 5,3 0,2 5,8 6,5 5,1 0,2 5,1 5,6 4,3 0,3 164,0 7,0 171,0 9,0 81,0 24,65 1000,0 4,1 4,8 3,4 0,3 12,7 8,0 8,7 C120104
TA-48 01/10/2015 00:20:00 5,7 6,2 5,2 0,2 5,6 6,2 4,9 0,2 4,6 5,2 3,7 0,3 162,0 7,0 169,0 9,0 82,0 24,55 999,0 3,6 4,3 3,0 0,3 12,7 8,0 8,7 C120104
这里第一行代表变量的标题和单位,后面是相邻行中的值。
例如,s5a、s5x、s5i、s5s 可以是另一个文本文件中的新变量。
谢谢!
没有任何选项的 dlmread
函数会将 space 和制表符都视为分隔符(至少在 R2014a 中):
mydata = dlmread('myfile.txt');
但是,这仅适用于数字数据,而且您的文件似乎也包含字符。相反,您可以通过使用 fgetl
从文件中获取一行然后使用 strcmp
检查 space 或制表符来执行此操作。循环中的类似内容:
line = fgetl(fid);
for k = 1:(length(line)-3);
if strcmp(line(k:(k+3)),' ');
% there's a tab here!
end
end
for k = 1:length(line);
if strcmp(line(k),' ');
% there's a space here!
end
end
请注意,这假设制表符为 4 space秒。
由于唯一的 space 分隔变量是日期和时间,我决定在导入整个制表符分隔文件后将它们分开。
为此,我使用了 tdfread
函数,即 returns 每一列作为一个结构项,然后使用简单的 strfind
.
将它们分开
我需要将 space 和制表分隔数据导入到矩阵样式变量或结构中,但文件格式不同,不允许我选择 %f %s pre-formatted 函数作为一个解法。新列将被添加到另一个文件或从一个文件中删除,我什至不知道它们的类型。
Excel 显示非常适合我的数据,如果我将它作为文本文件打开并简单地同时选择 space 和制表作为其分隔符。
如果您知道是否有任何文件导入功能可以让我遵循Excel的做法或对如何解决我的问题有任何想法,请谈谈!
下面是所用文本的示例部分:
loggername date__________ time________ s1a[m/s] s1x[m/s] s1i[m/s] s1s[m/s] s2a[m/s] s2x[m/s] s2i[m/s] s2s[m/s] s3a[m/s] s3x[m/s] s3i[m/s] s3s[m/s] d1a[°] d1s[°] d2a[°] d2s[°] h1a[%] t1a[°C] b1a[hPa] s4a[m/s] s4x[m/s] s4i[m/s] s4s[m/s] vxa[V] bla[V] bra[V] [-1=error] [ser.no.]
TA-48 01/10/2015 00:00:00 5,8 7,1 4,9 0,4 5,7 7,3 4,8 0,4 4,9 5,8 4,1 0,3 161,0 7,0 167,0 8,0 81,0 24,65 1000,0 4,0 4,7 3,3 0,3 12,7 8,0 8,7 C120104
TA-48 01/10/2015 00:10:00 5,8 6,5 5,3 0,2 5,8 6,5 5,1 0,2 5,1 5,6 4,3 0,3 164,0 7,0 171,0 9,0 81,0 24,65 1000,0 4,1 4,8 3,4 0,3 12,7 8,0 8,7 C120104
TA-48 01/10/2015 00:20:00 5,7 6,2 5,2 0,2 5,6 6,2 4,9 0,2 4,6 5,2 3,7 0,3 162,0 7,0 169,0 9,0 82,0 24,55 999,0 3,6 4,3 3,0 0,3 12,7 8,0 8,7 C120104
这里第一行代表变量的标题和单位,后面是相邻行中的值。
例如,s5a、s5x、s5i、s5s 可以是另一个文本文件中的新变量。
谢谢!
没有任何选项的 dlmread
函数会将 space 和制表符都视为分隔符(至少在 R2014a 中):
mydata = dlmread('myfile.txt');
但是,这仅适用于数字数据,而且您的文件似乎也包含字符。相反,您可以通过使用 fgetl
从文件中获取一行然后使用 strcmp
检查 space 或制表符来执行此操作。循环中的类似内容:
line = fgetl(fid);
for k = 1:(length(line)-3);
if strcmp(line(k:(k+3)),' ');
% there's a tab here!
end
end
for k = 1:length(line);
if strcmp(line(k),' ');
% there's a space here!
end
end
请注意,这假设制表符为 4 space秒。
由于唯一的 space 分隔变量是日期和时间,我决定在导入整个制表符分隔文件后将它们分开。
为此,我使用了 tdfread
函数,即 returns 每一列作为一个结构项,然后使用简单的 strfind
.