Matlab 以特定格式加载八度文本数据
我有一个数据集,我想存储,并能够在八度加载Matlab 以特定格式加载八度文本数据,matlab,io,octave,text-processing,Matlab,Io,Octave,Text Processing,我有一个数据集,我想存储,并能够在八度加载 18.0 8 307.0 130.0 3504. 12.0 70 1 "chevrolet chevelle malibu" 15.0 8 350.0 165.0 3693. 11.5 70 1 "buick skylark 320" 18.0 8 318.0 150.0 3436. 11.0 70 1
18.0 8 307.0 130.0 3504. 12.0 70 1 "chevrolet chevelle malibu"
15.0 8 350.0 165.0 3693. 11.5 70 1 "buick skylark 320"
18.0 8 318.0 150.0 3436. 11.0 70 1 "plymouth satellite"
16.0 8 304.0 150.0 3433. 12.0 70 1 "amc rebel sst"
17.0 8 302.0 140.0 3449. 10.5 70 1 "ford torino"
15.0 8 429.0 198.0 4341. 10.0 70 1 "ford galaxie 500"
14.0 8 454.0 220.0 4354. 9.0 70 1 "chevrolet impala"
14.0 8 440.0 215.0 4312. 8.5 70 1 "plymouth fury iii"
14.0 8 455.0 225.0 4425. 10.0 70 1 "pontiac catalina"
15.0 8 390.0 190.0 3850. 8.5 70 1 "amc ambassador dpl"
当我尝试使用以下工具时,它不会立即起作用:
data = load('auto.txt')
有没有办法从给定格式的文本文件加载,或者我需要将其转换为例如
18.0,8,307.0,130.0,3504.0,12.0,70,1
...
编辑:
删除最后一行并固定“一半”编号,例如3504。->3504
然后使用:
data = load('-ascii','autocleaned.txt');
按需要将数据加载到八度矩阵中。
load
通常用于加载八度和matlab二进制文件,但也可用于加载像您这样的文本数据。您可以使用“-ascii”
选项加载数据,但即使启用了“-ascii”
选项,您也必须在将文件放入load
之前稍微重新格式化文件。使用一致的列分隔符,即仅使用制表符或逗号,使用完整的数字而不是3850.
,并且不使用字符串
然后你可以做类似的事情让它工作
DATA = load("-ascii", "auto.txt");
如果从每行中删除最后一个字符串字段,则可以使用以下命令读取文件:
filename='stack25148040_1.txt'
fid = fopen(filename, 'r');
[x, count] = fscanf(fid, '%f', [10, Inf])
endif
fclose(fid);
或者,整个文件可以作为一列读入并重新格式化
我还没有弄清楚如何读取数字字段和字符串字段。为此,我不得不求助于Python,使用更通用的文件读取工具
下面是一个Python脚本,它读取文件,创建一个numpy
结构化数组,将其写入.mat
文件,然后Octave
可以读取:
import csv
import numpy as np
data=[]
with open('stack25148040.txt','rb') as f:
r = csv.reader(f, delimiter=' ')
# csv handles quoted strings with white space
for l in r:
# remove empty strings from the split on ' '
data.append([x for x in l if x])
print data[0]
for dd in data:
# convert 8 of the strings (per line) to float
dd[:]=[float(d) for d in dd[:8]]+dd[-1:]
data=data[:-1] # remove empty last line
print data[0]
print
# make a structured array, with numbers and a string
dt=np.dtype("f8,i4,f8,f8,f8,f8,i4,i4,|S25")
A=np.array([tuple(d) for d in data],dtype=dt)
print A
from scipy.io import savemat
savemat('stack25148040.mat',{'A':A})
在倍频程中
可以用
load stack25148040.mat
A
# A = 1x10 struct array containing the fields:
# f0 f1 ... f8
A.f8 # string field
A(1) # 1st row
# scalar structure containing the fields:
# f0 = 18
# f1 = 8
...
# f8 = chevrolet chevelle malibu
较新的倍频程(3.8)具有
importdata
功能。它处理原始数据文件,不带任何额外参数。它返回一个包含2个字段的结构
x.data
是一个(10,11)
矩阵<代码>x.数据(:,1:8)是所需的数字数据x.数据(:,9:11)
是NA
和随机数的混合体。NA
代表行末的单词x.textdata
是包含这些单词的(24,1)
单元格。可以使用NA
和引号从这些单词中重新组合带引号的字符串s,以确定有多少单词属于哪一行
要读取数字数据,它使用dlmread
。由于importdata
的其余部分是用Octave
编写的,因此它可以用作正确处理字符串数据的自定义函数的起点
dlmread ('stack25148040.txt')(:,1:8)
importread ('stack25148040.txt').data(:,1:8)
textread ('stack25148040.txt','')(:,1:8)
试试这个
data = importdata('Auto.data')
由于所有数据都在固定宽度的列中(最后的字符串除外),因此您应该能够使用
fscanf
对该行进行解码,逐行读取数据。实际上,您将使用与编写它相同的记录说明符(C或Fortran)或fprintf
来读取它。我已经知道如何使用其csv
和numpy
模块将其加载到Python
中,然后通过.mat
文件将其传输到倍频程。结果是一个1x10结构数组
,包含9个字段-8个数字和1个字符串。如果你想的话,我可以把它作为一个答案发布。@hpaulj很有兴趣了解更多的低级方法来实现这一点。目前,清理输入文件并使用load对我来说已经足够了。但有些情况下你需要更多的控制。在这里,更专业的方法可能会派上用场。进一步挖掘倍频程文档,我发现它确实有dlmread
,csvread
,fileread
,textread
,textscan
。除dlmread
之外的所有内容都会被解释,可以使用类型
读取。