如何获取组件和搜索 CSV 文件

how to get components and search csv file

本文关键字:搜索 CSV 文件 组件 何获取 获取      更新时间:2023-10-16

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::regexstd::regex_match函数:^[A-Z]{2}/[A-Z]{2}(($[A-Z]{2})+)$.但这完全取决于字符串的格式。

当然,您可以调整您的正则表达式,他们会给您任何您想要的东西。