CSV文件中的逗号、双引号的转义。读写带特殊字符的csv文件。

如果字段中有逗号(,),该字段使用双引号(")括起来;
如果该字段中有双引号,该双引号前要再加一个双引号,然后把该字段使用双引号括起来。

字段处理前 字段处理后
abc,d2 “abc,d2”
ab"c,d2 “ab”“c,d2”
"abc “”“abc”
“” “”""""

参考文章:https://www.cnblogs.com/xiaomiganfan/p/4073454.html

读写代码参考:
C++: Minimalistic CSV Streams - CodeProject https://www.codeproject.com/Articles/741183/Cplusplus-Minimalistic-CSV-Streams
此版本的代码可支持逗号、双引号转义字符。

示例代码较多,我自己反复测试,简化使用例子代码如下:


struct Product
{
     
	Product() : name(""), qty(0), price(0.0f) {
     }
	Product(std::string name_, int qty_, float price_) : name(name_), qty(qty_), price(price_) {
     }
	std::string name;
	int qty;
	float price;
};

using namespace mini;
void test_csv_io()
{
     
	csv::ofstream os("products.csv");
	os.set_delimiter(',',"");
	os.enable_surround_quote_on_str(true, '\"', "\"\"");
	if (os.is_open())
	{
     
		Product product("Shampoo", 200, 15.0f);
		os << product.name << product.qty << product.price << NEWLINE;
		Product product2("S,oa\"p", 300, 6.0f);
		os << product2.name << product2.qty << product2.price << NEWLINE;
	}
	os.flush();
	os.close();

	csv::ifstream is("products.csv");
	is.set_delimiter(',', "");
	is.enable_trim_quote_on_str(true, '\"', "\"\"");
	if (is.is_open())
	{
     
		Product temp;
		while (is.read_line())
		{
     
			is >> temp.name >> temp.qty >> temp.price;
			// display the read items
			std::cout << temp.name << "," << temp.qty << "," << temp.price << std::endl;
		}
	}
}

生成的products.csv文件内容如下:

"Shampoo",200,15
"S,oa""p",300,6

以上刚好是标准csv的格式。
minicsv中示例的生成结果,往往把,替换为##、$$,双引号默认替换为

&quot;

反而不是我所希望的结果。
所以我自己改的例子中,写成如下配置:

	os.set_delimiter(',',"");
	os.enable_surround_quote_on_str(true, '\"', "\"\"");
	
	is.set_delimiter(',', "");
	is.enable_trim_quote_on_str(true, '\"', "\"\"");

你可能感兴趣的:(csv)