如果字段中有逗号(,),该字段使用双引号(")括起来;
如果该字段中有双引号,该双引号前要再加一个双引号,然后把该字段使用双引号括起来。
字段处理前 |
字段处理后 |
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中示例的生成结果,往往把,替换为##、$$,双引号默认替换为
"
反而不是我所希望的结果。
所以我自己改的例子中,写成如下配置:
os.set_delimiter(',',"");
os.enable_surround_quote_on_str(true, '\"', "\"\"");
is.set_delimiter(',', "");
is.enable_trim_quote_on_str(true, '\"', "\"\"");