CSV文件简介及C++实现

版权宣称:冠词是视频博客作者的新颖的文字。,未必博主批准,不得武断地转载。。

逗号除法值(逗号除法) Values,CSV,偶尔称为性格除法符值。,因独立的性格不克不及逗号。:其文件存储器在以纯主题体式最高纪录(数字和主题)中。。纯主题断定文件是性格序列。,不使具体化不得已解说为二进制位的最高纪录。。CSV文件由任性音量的记载结合。,记载由换行符除法。;每个记载由担任守队队员结合。,担任守队队员经过的除法符是停止性格或性格串。,最公共用地的是逗号或符号。。通常,占有记载都有完整同样地的担任守队队员序列。。

CSV文件体式的普通基准不在。,但在RFC 4180,有根本的描绘。。还无选定的器械的性格编码。,但7位 ASCII是最根本的传播编码。。

CSV是传播的。、对立简略的文件体式,被用户、贸易与迷信的广延的器械。最广延的器械的器械是在顺序经过播送表最高纪录。,而这些顺序它本身是在不亲和的的体式上举行手柄的(常常是公相当多的和/或无说明的体式)。因落落大方的顺序后退一种CSV变体。,反正作为任一可选的出口/出口体式。。

CSV故障单一的。、解释良好的体式(但RFC) 4180有任一经用的解释。。因而在实践中,CSV一词普通指具有下列的性格的无论哪个文件:

(1)、纯主题,器械性格集,比如,ASCII、Unicode、EBCDIC或GB2312(简体中文)等;

(2)、由记载结合的(通常是每行任一记载);

(3)、每个记载经过分离装置划分为担任守队队员(类型的分离装置具有CO)。、分号或制表符;偶尔分离装置可以包孕可选空白表格。;

(4)、每个记载具有同样地的担任守队队员序列。。

在这些习俗约束下,有很多的CSV变体。,例如,CSV文件故障完整交流的。。又,这些多样化非常奇特的小。,静静地很多器械顺序容许用户预示文件。,因它是纯主题。,以后选定的除法符。、偷懒规章等。。假使倘若CSV文件的多样化大于正常,非常倘若接纳顺序的漫游。,人工控制反省和主编文件通常是可实行的的。,或许经过简略的顺序来使复原成绩。。因而在实践中,CSV文件然而很便利的。。

CSV体式最好用来表现记载的集中或序列。,每个记载具有完整同样地的担任守队队员序列。。CSV体式不限于倘若性格集。。Unicode或ASCII,无成绩(随意倘若顺序后退的CSV可能性有。它甚至可以从任一性格集翻译成另任一性格集。,CSV文件无成绩(形形色色的的近乎占相当多的独家新闻最高纪录体式)。。又,CSV不开价无论哪个方法来指代器械什么性格集。。

在CSV体式中在落落大方变异的不适合。在公共用地用法中,近乎无论哪个除法的主题最高纪录都可以统称为CSV。。形形色色的的CSV体式可能性不亲和的。。

以上所述满意的首要来自某处: 维基百科 

上面的法典是任一援用。,可以获得对简略老虎机游戏下载的解析:

假使老虎机游戏下载构成复杂,您可以在GITHUB上尝试任一开源库。:  https://github.com/ben-strasser/fast-cpp-csv-parser

:

#ifndef FBC_CPPBASE_TEST_PARSE_CSV_HPP_
#define FBC_CPPBASE_TEST_PARSE_CSV_HPP_

// reference: ?page=1&tab=votes#tab-top

#include 
#include 
#include 
#include 
#include 
#include 

class CSVRow {
public:
STD::性格串 const& 手柄员[ ] 键入) const { return m_data[index]; }
	std::size_t size() const { return m_(); }

	void readNextRow(std::istream& STR)
	{
	STD::性格串 line;
STD::GETLIN(STR), 线)

	STD::性格串stream lineStream(线)
	STD::性格串 cell;

		();
		while (std::getline(lineStream, cell, '','')) {
(细胞)
		}
		// This checks for a trailing comma with no data after it.
		if (!lineStream && ()) {
			// If there was a trailing comma then add an empty 元素。
			("");
		}
	}

private:
STD::拥护者  m_data;
};

std::istream& operator>>(std::istream& str, CSVRow& 最高纪录)
{
	(STR);
	return str;
}

class CSVIterator {
public:
	/*typedef std::input_iterator_tag iterator_category;
	typedef CSVRow value_type;
	typedef std::size_t difference_type;
	typedef CSVRow* pointer;
	typedef CSVRow& reference;*/

	CSVIterator(std::istream& STR) :m_str(() ? &str : nullptr) { 这人) }
	CSVIterator() :m_str(nullptr) {}

	// Pre Increment
	CSVIterator& operator++() { if (m_STR) { if (!((*m_STR) >> m_row)){ m_str = nullptr; } }return *this; }
	// Post increment
	CSVIterator operator++(int)) { CSVIterator TMP(*此) 这人) return tmp; }
	CSVRow const& operator*() const { return m_row; }
	CSVRow const* operator->() const { return &m_row; }

	bool operator==(CSVIterator const& RHS) { return (这人(这人) == &RHS) || (这人(这人)->m_str == nullptr) && (rhs.m_str == nullptr))); }
	bool operator!=(CSVIterator const& RHS) { return !这人) == RHS); }

private:
	std::istream* m_str;
	CSVRow m_row;
};

#endif // FBC_CPPBASE_TEST_PARSE_CSV_HPP_

test_parse_csv.cpp:

#include ""
#include 
#include 
#include 
#include 
#include ""

namespace parse_cvs_ {

int test_parse_cvs_1()
{
	std::ifstream file("E:/GitCode/Messy_Test/testdata/");

STD::拥护者> data;
	CSVIterator 成环(文件)
	for (; loop != CSVIterator(); 成环) {
		CSVRow row = *loop;
	STD::拥护者 tmp(());
		for (int) i = 0; i < (); ++i) {
			tmp[i] = row[i];
		}
		(tmp);
	}

	for (int) i = 0; i < (); ++i) {
		for (int) j = 0; j < data[i].size(); ++j) {
			fprintf(stdout, "%s\t", data[i][j].c_str());
		}
		fprintf(stdout, "\n");
	}

	return 0;
}

} // namespace parse_cvs_

测试最高纪录列举如下:

结实列举如下。:

GitHub:  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

`