如何在点上拆分字符串并有效地提取所有字段?

Posted

技术标签:

【中文标题】如何在点上拆分字符串并有效地提取所有字段?【英文标题】:How to split the string on a dot and extract all the fields efficiently? 【发布时间】:2013-11-26 05:12:09 【问题描述】:

我正在尝试在点上拆分我的实际key,然后在点上拆分后提取所有字段。

我的钥匙看起来像这样 -

t26.example.1136580077.colox

目前,我只能提取第一个字段 t26 在第一个点上拆分后。现在我不确定如何使用以下更像 C 的代码来提取所有其他字段。

下面是我目前用来从中提取第一个字段的代码。

if (key)

    char* first_dot = strchr(key, '.');
    if (first_dot)
    
        // cut at the first '.' character
        first_dot[0] = 0;
    


cout << "Fist Key: " << key << endl;

在点上分割后。我的第一个字段是string,在这种情况下是t26,第二个字段也是string,在这种情况下是example,第三个字段是uint64_t,在这种情况下是1136580077和第四个字段也将是字符串,在本例中为colox

有什么想法可以有效地做到这一点吗?与istringstream 相比,使用strtok 效率更高?

【问题讨论】:

使用strtok效率更高 @AliKazmi,只是好奇为什么会这样? strtok是基于c的函数,说到C#中的Split函数,它代表用户调用strtok,所以我们不直接调用strtok,节省一些执行时间吗? 【参考方案1】:
#include <stdint.h>
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

vector<string> spilt(char str[])

    vector<string> res;
    char* p;
    char* totken = strtok_s(str, ".", &p);
    while(totken != NULL)
    
         res.push_back(totken);
         totken = strtok_s(NULL, ".", &p);
    
    return res;


int main()

    char str[] = "t26.example.1136580077.colox";
    vector<string> res = spilt(str);
    string field1 = res[0];
    string field2 = res[1];
    uint64_t field3 = atoi(res[2].c_str());
    string field4 = res[3];

    cout<<field1<<" "<<field2<<" "<<field3<<" "<<field4<<endl;

【讨论】:

不使用 while 循环有没有办法提取所有内容,以便我可以将单个值放入其数据类型中? 我认为你不能。 Mybe,您应该使用一些正则表达式库。 我明白了.. 如果我们需要使用 while 循环,那么如何将单个字段值放入其相应的数据类型中,如我在问题中所示? @TrekkieTechieT-T 我已经更新了我的答案,请试一试。 谢谢。添加代码并编译后,这就是我得到的error: âstrtok_sâ was not declared in this scope。知道如何解决这些问题吗?【参考方案2】:

编写一个拆分字符串并限定键的组件的函数。考虑到您对效率的关注,请使用 strchr 定位点并使用 strncpy 提取组件值,其中 strncpy 的长度由指针增量确定。

这是一些未经测试的伪代码:

const int MAX_COMP_SIZE = 256;

int count = 0;
const char *p = key;

if (p != NULL) 

    char comp[MAX_COMP_SIZE];
    const int CompSize = sizeof(comp)/sizeof(comp[0]);

    while (*p != '\0')
    
        const char *q = strchr(p, '.');

        if (q != NULL)
        
            int len = q - p;

            if (len >= CompSize)
                return -1;

            strncpy(comp, p, q-p)[len] = '\0';
        
        else
        
            if (strlen(p) >= CompSize)
                return -1;

            strcpy(comp, p);
        

        // store/verify key components based on index, count
        // implement in separate function
        switch(count)
        
            case 0: ...
            case 1: ...
            default: return -1;
        

        count++

        if (q == NULL)
            break;

        q++; // skip dot

        p = q; // setup next

    

   

if (count < REQUIRED_KEY_COMPONENTS)
    return -1;

【讨论】:

以上是关于如何在点上拆分字符串并有效地提取所有字段?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:除非在点之前有数字或字符,否则在点上拆分

在 PostgreSQL 中提取拆分字符串的最后一部分的最有效方法是啥?

如何拆分熊猫字符串以提取中间名?

如何有效地从 JSON 列中提取字段?

r 在点上绘制多边形并导出到ESRI Shapefile

如何在shell中拆分字符串并获取最后一个字段