我有一个我想要存储的数据集,并且能够在Octave中加载
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.0 然后使用:
data = load('-ascii','autocleaned.txt');
将所需数据加载到Octave中的矩阵中。
答案 0 :(得分:5)
load
通常用于加载octave和matlab二进制文件,但可用于加载像你这样的文本数据。您可以使用"-ascii"
选项加载数据,但即使启用了load
选项,您也必须稍微重新格式化文件,然后再将其放入"-ascii"
。使用一致的列分隔符即。只是一个标签或逗号,请使用不是3850.
的完整数字,并且不要使用字符串。
然后你可以做这样的事情让它发挥作用
DATA = load("-ascii", "auto.txt");
答案 1 :(得分:5)
如果从每行中删除了最后的字符串字段,则可以使用以下命令读取该文件:
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})
在Octave
中可以阅读
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
较新的Octave(3.8)具有importdata
功能。它处理原始数据文件,没有任何额外的参数。它返回一个包含2个字段的结构
x.data
是(10,11)
矩阵。 x.data(:,1:8)
是期望的数值数据。 x.data(:,9:11)
是NA
和随机数的混合。 NA
代表行末的单词。 x.textdata
是包含这些字词的(24,1)
单元格。引用的字符串s可以从这些单词中重新组合,使用NA
和引号来确定有多少单词属于哪一行。
要阅读它使用的数字数据dlmread
。由于importdata
的其余部分是用Octave
编写的,因此它可以用作正确处理字符串数据的自定义函数的起点。
dlmread ('stack25148040.txt')(:,1:8)
importread ('stack25148040.txt').data(:,1:8)
textread ('stack25148040.txt','')(:,1:8)
答案 2 :(得分:0)