Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 以特定格式加载八度文本数据_Matlab_Io_Octave_Text Processing - Fatal编程技术网

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
之外的所有内容都会被解释,可以使用
类型
读取。