从excel / CSV值创建静态数组

时间:2018-03-27 18:58:02

标签: c++ arrays

我在Excel中有一个包含不同数据类型的大型数组。请参阅以下代码段:

Param,String1,String2,Bits,Disp fmt,Extra,use act
0,Coarse,Tune,4,2,,0
1,Wave,form,4,7,128,0
2,Filter,Type,4,8,,0
3,F Env,A,4,5,3,0
4,F Env,D/R,4,5,3,0
5,F Env,S,4,5,3,0
6,A Env,A,4,6,6,0
7,A Env,D,4,6,6,0
8,A Env,S,4,6,6,0
9,A Env,R,4,6,6,0
10,LFO,Wave,4,7,64,0

.......等

有2个字符串和一些整数。我需要找到一种尽可能高效地将其转换为C ++的方法。它适用于嵌入式系统,因此需要在C ++代码中完全独立(无法打开其他应用程序,读取文件等)。

我最初的想法是创建一个包含列中数据类型的类 然后声明该类的静态数组。但是,如何在运行时使用数据填充数组?

必须将数组声明为静态const,以便它进入程序存储器,而不是SRAM。

关于字符串元素,只有数据中的某些行会有字符串,所以当只有一些字符串被填充时,不要为它们初始化固定大小的数组。

显然,这些数据最初不必存在于Excel中,如果有更好的方法在C ++中生成大型静态数组,我很乐意尝试。

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,使用外部程序解析CSV。 然后创建struct数组。此thread显示语法选项。

特别是在这种情况下,我创建了以下结构:

typedef struct ParamInfo
{
    const char *label1;
    const char *label2;
    uint8_t bits;
    uint8_t dispFmt;
    uint8_t tag;
    uint8_t ctrl;
} ParamInfo;

然后写了一个解析器,它创建了所有不同短语的查找,并创建了所有短语的静态consts,因此每个短语只存储在内存中一次。这使用最小可能的内存,而不是在最大所需大小的结构中声明一个数组并多次声明相同的短语。

static const char S_COARSE[] = "Coarse";
static const char S_TUNE[] = "Tune";
static const char S_WAVE[] = "Wave";
static const char S_FORM[] = "form";
static const char S_FILTER[] = "Filter"; 

等...

然后填充struct的静态const数组:

static const ParamInfo ATM_PARAM_INFO[48] = {
    {
        S_COARSE,S_TUNE,4,2,0,1 // ATM_COARSETUNE
    },
    {
        S_WAVE,S_FORM,4,7,128,2 // ATM_WAVEFORM
    },
    {
        S_FILTER,S_TYPE,4,8,0,3 // ATM_FILTTYPE
    },
    {
        S_F_ENV,S_A,4,5,3,4 // ATM_FENVA

等...