关于csv:C ++从函数返回字符串数组

C++ return array of strings from a function

我正在研究一个简单的csv解析器。

从我的csv文件中,我得到第一行作为字符串,比如:

1
"117;'Tom';'Sawyer';";

我要实现的是一个将字符串拆分为多个部分的函数,类似于php的explode:

1
2
3
$string ="117;'Tom';'Sawyer';";
$row = explode(";", $string);
echo $row[0];

我需要一个函数来返回行变量中的字符串数组。

我是新的C++,所以我不知道什么寻找或使用。


似乎您正在寻找一个函数,该函数使用一些指定的分隔符拆分字符串,并将它们放入顺序容器中。

下面是一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <string>
#include <vector>
#include <iterator>

/// Splits the string using provided delimiters and puts the pieces into a container.
/// The container must provide push_back and clear methods.
/// @param a The contaner to put the resulting substrings into
/// @param str The string to operate on
/// @param delims Characters that are to be treated as delimiters
/// @param compress_delims If set to true, will treat mutiple sequential delimiters as a single one
template<class StringType, class ContainerType>
void split_string(ContainerType& a, const StringType& str, const StringType& delims, bool compress_delims = true)
{
        typename StringType::size_type search_from = 0; // Place to start looking for delimiters
        typename StringType::size_type next_delim;      // Location of the next delimiter

        a.clear(); // Wipe out previous contents of the output container (it must be empty if the input string is empty)

        // Find the first delim after search_from,
        // add the substring between search_from and delimiter location to container,
        // update search_from to delimiter location + 1 so that next time we search,
        // we encounter the next delimiter. Repeat until we find the last delimiter.
        while((next_delim = str.find_first_of(delims, search_from)) != StringType::npos) {
                // If we encounter multiple delimiters in a row and compress_delims is true
                // treat it as a single delim.
                if(!(compress_delims && next_delim - search_from <= 1)){
                        StringType token = str.substr(search_from, next_delim - search_from);
                        a.push_back(token);
                }
                search_from = next_delim + 1;
        }

        // If we found the last delimiter and there are still some chars after it,
        // just add them to the container.
        if(search_from < str.length())
                a.push_back(str.substr(search_from));
}

int main()
{
        std::vector<std::string> container;
        std::string str =" hello so long    good  bye hurray   ";
        split_string(container, str, std::string(""));
        std::copy(container.begin(), container.end(), std::ostream_iterator<std::string>(std::cout,","));
        std::cout << " (" << container.size() <<")" << std::endl;
        return 0;
}

但是,如果可以在你的项目中使用boost,我建议你这样做。使用boost.string_algo库,其中包含用于特定目的的split函数(示例用法)。


这是一个很常见的问题,如果您搜索它,您可以相对轻松地找到它。以下是一些可能有帮助的信息:

https://stackoverflow.com/a/236803/1974937