问题描述
我一直在研究*.csv
解析器,并且在大多数情况下都可以使用。解析基本上是这样的:
-
i)将这一行流式传输为line_stream(使用
std::istringstream
)。 -
可以通过专用接口
database
接口访问提取的数据字符串,直到解析器对象销毁(或者直到我实现将其转换为可用数据的字符串处理器为止)。
解析器对象正常工作,除了总是删除向量的第一个字符串元素的第一个字符。例如:
0544,1,Kitchenware,2,27
变成了:
544,27
这是令人无法接受的信息丢失,但是我无法弄清楚此问题的原因。我已经通过在每个数据包迭代器之前推送一个dummy
字符串来解决此问题,
,ummy,0544,27
但是我仍然觉得这是一个非常糟糕的实现。
我怀疑这是line_stream的问题,但并不完全确定如何解决。
下面是源代码:
#ifndef _CSVPARSER_HPP
#define _CSVPARSER_HPP
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
const char DEFAULT_COLUMNS_SEParaTOR = ',';
class csvStream {
private:
void _setopen() { inStream.open(fpath,ios::in); }
protected:
string fpath;
fstream inStream;
public:
explicit csvStream(const string& path) {
fpath = path;
_setopen();
}
};
template <typename T>
class csvParser : protected csvStream {
private:
int numDataTypes;
char col_separator;
string extractedRawLine;
// Database of extracted packets of data as strings.
vector<vector<string>*> database;
// Return a reference to <data as a packet of strings>.
vector<string>& _rawToStringPacket() {
// line stream buffer & token
istringstream line_stream;
static string token;
// new packet on the heap
vector<string>* packet = nullptr;
packet = new vector<string>;
// extract strings into packet
line_stream.str(extractedRawLine);
packet->push_back("dummy");
for (int i = 1; i < numDataTypes + 1; ++i) {
getline(line_stream,token,col_separator);
packet->push_back(token);
}
return *packet;
}
/****************************PUBLIC-API****************************/
public:
// Explicit Constructor: Must supply path to a *.csv file and the number of
// data columns.
explicit csvParser(const string& path,const int ntypes,const char sptr = ',')
: csvStream(path),numDataTypes{ntypes},col_separator{sptr} {}
// Extract all data while stream is open.
void extractAllRaw() {
// continue to extract data until the end of file:
while (getline(*inStream,extractedRawLine)) {
static vector<string>* temp = nullptr;
temp = &_rawToStringPacket();
database.push_back(temp);
}
}
// Stream the data elements to standard output.
void printDatabase(ostream& os = cout) {
for (auto i : database) {
for (int j = 0; j < static_cast<int>(i->size()); ++j) {
os << (*i)[j] << ",";
}
os << '\n';
}
}
};
#endif
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)