如何用dlmread读取十六进制数?

时间:2014-07-28 13:25:24

标签: matlab file parsing csv octave

我正在尝试用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地址,但自动解决方案会很方便。

2 个答案:

答案 0 :(得分:3)

函数dlmreadcsvread将处理数字文件。您可以使用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