我正在尝试用Octave读取.csv
文件(我想它在Matlab上是等效的)。其中一列包含识别MAC地址的十六进制值,但我还是想解析它,我不介意它是否转换为十进制。
是否可以使用dlmread
等功能自动执行此操作?或者我是否必须创建自定义函数?
这是文件的样子:
Timestamp, MAC, LastBsn, PRR, RSSI, ED, SQI, RxGain, PtxCoord, Channel: 26
759, 0x35c8cc, 127, 99, -307, 29, 237, 200, -32
834, 0x32d710, 183, 100, -300, 55, 248, 200, -32
901, 0x35c8cc, 227, 100, -300, 29, 238, 200, -32
979, 0x32d6a0, 22, 95, -336, 10, 171, 200, -32
987, 0x32d710, 27, 96, -328, 54, 249, 200, -32
1054, 0x35c8cc, 71, 92, -357, 30, 239, 200, -32
1133, 0x32d6a0, 122, 95, -336, 11, 188, 200, -32
我可以接受(截断的)MAC地址的任何输出值,从序列号(1-6)到值的十进制转换(例如0x35c8cc -> 3524812
)。
我目前的解决方法是使用文本编辑器手动用十进制数替换MAC地址,但自动解决方案会很方便。
答案 0 :(得分:3)
函数dlmread
和csvread
将处理数字文件。您可以使用textscan
(也存在于Matlab中),但由于您使用的是Octave,因此最好使用csv2cell
(Octave的io包的一部分)。它基本上读取一个csv文件并返回一个字符串和双精度的单元格数组:
octave-3.8.1> type test.csv
1,2,3,"some",1c:6f:65:90:6b:13
4,5,6,"text",0d:5a:89:46:5c:70
octave-3.8.1> plg load io; # csv2cell is part of the io package
octave-3.8.1> data = csv2cell ("test.csv")
data =
{
[1,1] = 1
[2,1] = 4
[1,2] = 2
[2,2] = 5
[1,3] = 3
[2,3] = 6
[1,4] = some
[2,4] = text
[1,5] = 1c:6f:65:90:6b:13
[2,5] = 0d:5a:89:46:5c:70
}
octave-3.8.1> class (data{1})
ans = double
octave-3.8.1> class (data{9})
ans = char
答案 1 :(得分:0)
>> type mycsv.csv
Timestamp, MAC, LastBsn, PRR, RSSI, ED, SQI, RxGain, PtxCoord, Channel: 26
759, 0x35c8cc, 127, 99, -307, 29, 237, 200, -32
834, 0x32d710, 183, 100, -300, 55, 248, 200, -32
901, 0x35c8cc, 227, 100, -300, 29, 238, 200, -32
979, 0x32d6a0, 22, 95, -336, 10, 171, 200, -32
987, 0x32d710, 27, 96, -328, 54, 249, 200, -32
1054, 0x35c8cc, 71, 92, -357, 30, 239, 200, -32
1133, 0x32d6a0, 122, 95, -336, 11, 188, 200, -32
您可以使用csv2cell读取文件。以“ 0x”开头的值将自动从十六进制转换为十进制值。参见:
>> pkg load io % load io package for csv2cell
>> data = csv2cell ("mycsv.csv");
>> data(2,1)
ans =
{
[1,1] = 759
}
要访问单元格值,请使用:
>> data{2,1}
ans = 759
>> data{2,2}
ans = 3524812
>> data{2,5}
ans = -307