如何获取组件和搜索 CSV 文件
how to get components and search csv file
int main(( {
struct tokens : std::ctype<char>
{
tokens() : std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
typedef std::ctype<char> cctype;
static const cctype::mask *const_rc = cctype::classic_table();
static cctype::mask rc[cctype::table_size];
std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask));
rc['/'] = std::ctype_base::space;
rc['$'] = std::ctype_base::space;
return &rc[0];
}
};
std::string FormatMsg = "AB/LK$VD$SA$PO";
cin >> FormatMsg;
std::stringstream ss(FormatMsg);
ss.imbue(std::locale(std::locale(), new tokens()));
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "n"));
system("Pause");
}
从这段代码中,我想获取 AB、LK 和 SA,并从单独的 CSV 文件中查找类似的组件。 谁能帮我?
这个问题需要std::regex
。
您可以搜索模式、匹配模式或迭代模式。
这可用于拆分字符串。
长期以来,C++一直具有内置和专用功能,专门为此目的而设计,用于标记字符串(将字符串拆分为标记(。而且由于可以使用为此目的而设计的简单专用功能,因此应该使用它。不需要外部库或复杂的构造。只需使用std::sregex_token_iterator
.
这是一个迭代器(与许多其他迭代器一样(,它迭代字符串的标记(子字符串(。所以,我们想要什么。
然后,我们可以使用std::vector
的范围构造函数编写一些简单的东西,如下所示:
std::vector tokens(std::sregex_token_iterator(msg.begin(), msg.end(), delimiter, -1), {}));
因此,我们定义了一个名为std::vector
型"令牌"的变量(使用 CTAD 自动推断向量的类型(。我们使用它的范围构造函数,并提供一个开始和一个结束迭代器。开始迭代器是std::sregex_token_iterator
,结束迭代器是其默认初始化的对应项。简单地{}
.
为了将这样的向量放入 2D 向量中,我们使用外部向量emplace_back
函数,并对内部向量进行就地构造。
所以你用 2 条语句阅读了整个 CSV 文件
- 一个简单的 for 循环
- 一个简单的嵌合背与
std::sregex_token_iterator
// We will read all lines of the source file with a simple for loop and std::getline
for (std::string msg{}; std::getline(csvFile, msg); ) {
// We will split the one big string into tokens (sub-strings) and add it to our 2D array
csvData.emplace_back(std::vector<std::string>(std::sregex_token_iterator(msg.begin(), msg.end(), delimiter, -1), {}));
}
这就是理论。实际上,这意味着对于您的情况,您只需要定义一个变量令牌并使用其构造函数。不需要其他声明。我们有一个典型的一个衬里。
您的代码如下所示:
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <iterator>
#include <algorithm>
// Slash and $ are the delimiters
std::regex delimiter{ R"(/|$)" };
int main() {
// The test data
std::string msg = "AB/LK$VD$SA$PO";
// Defining the variable token and initialize it using its range constructor
std::vector tokens(std::sregex_token_iterator(msg.begin(), msg.end(), delimiter, -1), {});
// Show result on the screen
std::copy(tokens.begin(), tokens.end(), std::ostream_iterator<std::string>(std::cout, "n"));
return 0;
}
源文件的描述不是很详细。我不知道您的CSV数据的结构。
如果还有其他不同格式的字符串,则可以添加具有如下std::regex
的std::regex_match
函数:^[A-Z]{2}/[A-Z]{2}(($[A-Z]{2})+)$
.但这完全取决于字符串的格式。
当然,您可以调整您的正则表达式,他们会给您任何您想要的东西。
- 有根的二进制搜索树.保留与其父级的链接
- 正在将csv文件读取为双精度矢量
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 如何选择在 csv 文件中输出的位置
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- std::unordered_map 搜索算法是如何实现的?
- 如何获取组件和搜索 CSV 文件
- 在 C++ 上的 CSV 文件中搜索名称
- 将二进制搜索树导出到.csv文件
- C++ 在 CSV 文件中搜索单词