C++ CSV解析与c++;
我正在尝试创建一个代码,通过csv数据库解析股票信息。目前,我已经生成了代码,这样它将使用关键字搜索并打印整行,但我正在尝试获取它,以便它将以整洁的格式打印整行和标题行 我正在尝试获取它,这样如果我搜索谷歌,它就会返回 符号GOOGC++ CSV解析与c++;,c++,parsing,csv,C++,Parsing,Csv,我正在尝试创建一个代码,通过csv数据库解析股票信息。目前,我已经生成了代码,这样它将使用关键字搜索并打印整行,但我正在尝试获取它,以便它将以整洁的格式打印整行和标题行 我正在尝试获取它,这样如果我搜索谷歌,它就会返回 符号GOOG 名称谷歌公司 今日高点568.77美元 csv的外观: 符号、名称、价格、今日高点、今日低点、52周低点 谷歌公司,谷歌公司,568.77美元,570.25美元,560.35美元 苹果公司AAPL,93.28美元,63.89美元,99.44美元 代码: 字符串名称搜
名称谷歌公司
今日高点568.77美元 csv的外观: 符号、名称、价格、今日高点、今日低点、52周低点
谷歌公司,谷歌公司,568.77美元,570.25美元,560.35美元
苹果公司AAPL,93.28美元,63.89美元,99.44美元 代码:
字符串名称搜索::getInput()
{
cout列)
{
打破
}
if(companyname==输入)
{
cout这是您的解决方案(最接近您的要求):
您可以随意处理该记录。从文件中读取的第一次内容将为您带来标题。每一次读取都会用csv值填充每条记录。这是您的解决方案(最接近您的要求):
只需处理记录即可。从文件中读取的第一次内容将为您带来标题。下一次读取将用csv值填充每条记录。首先,逗号应解析为空白。您可以通过更改流区域设置中的内部std::ctype
方面来完成此操作:
struct csv\u分类:std::ctype{
csv_分类():ctype(make_table()){}
私人:
静态掩码*make_table(){
常数掩码*classic=classic_表();
静态标准::向量v(经典、经典+表格大小);
v[',']|=空间;
v['']&=~空间;
返回&v[0];
}
};
然后使用以下命令设置区域设置:
ifs.imbue(std::locale(ifs.getloc(),新的csv_分类));
接下来,制作一个操纵器,检查您是否在该行的末尾。如果是,则将std::ios_base::failbit
标志设置为流状态。还可以使用内部存储来判断记录是否属于映射中的键或值。从Dietmar借用一点
static int row_end=std::ios_base::xalloc();
std::istream&record(std::istream&is){
while(std::isspace(is.peek()){
intc(is.peek());
is.ignore();
如果(c=='\n'){
is.iword(row\u end)=!is.iword(row\u end);
is.setstate(std::ios_base::failbit);
}
}
回报是;
}
然后你可以做:
std::向量键、值;
对于(std::string item;;){
如果(ifs>>记录>>项目)
按键。推回(项目);
else if(ifs.eof())
打破
else if(如果是iword(第_行末尾)){
ifs.clear();
而(ifs>>记录>>项目)
值。推回(项目);
}
其他的
打破
}
现在我们需要应用键和值并打印出来。我们可以为此创建一个新算法:
模板
每个二进制范围(Iter1 first1,Iter1 last1,
Iter2 first2,Iter2 last2,函数f)
{
assert(std::distance(first1,last1)首先,应将逗号解析为空白。您可以通过更改流区域设置中的内部std::ctype
facet来完成此操作:
struct csv\u分类:std::ctype{
csv_分类():ctype(make_table()){}
私人:
静态掩码*make_table(){
常数掩码*classic=classic_表();
静态标准::向量v(经典、经典+表格大小);
v[',']|=空间;
v['']&=~空间;
返回&v[0];
}
};
然后使用以下命令设置区域设置:
ifs.imbue(std::locale(ifs.getloc(),新的csv_分类));
接下来,制作一个操纵器,检查您是否在该行的末尾。如果是,则将std::ios_base::failbit
标志设置为流状态。还可以使用内部存储来判断记录是否属于映射中的键或值。从Dietmar借用一点
static int row_end=std::ios_base::xalloc();
std::istream&record(std::istream&is){
while(std::isspace(is.peek()){
intc(is.peek());
is.ignore();
如果(c=='\n'){
is.iword(row\u end)=!is.iword(row\u end);
is.setstate(std::ios_base::failbit);
}
}
回报是;
}
然后你可以做:
std::向量键、值;
对于(std::string item;;){
如果(ifs>>记录>>项目)
按键。推回(项目);
else if(ifs.eof())
打破
else if(如果是iword(第_行末尾)){
ifs.clear();
而(ifs>>记录>>项目)
值。推回(项目);
}
其他的
打破
}
现在我们需要应用键和值并打印出来。我们可以为此创建一个新算法:
模板
每个二进制范围(Iter1 first1,Iter1 last1,
Iter2 first2,Iter2 last2,函数f)
{
断言(标准::距离(first1,last1)最后一行是什么?它和格式要求有什么关系?最后一行是什么?它与格式要求有关吗?所有这些都是打印流。他希望它像他在提问中显示的格式。1秒。我会改变样本。@努努伊抱歉,如果这是显而易见的,我是C++初学者,但是DOE。上面的代码以什么作为输入,搜索什么或者手动输入整行内容?因为上面的csv只是一个包含更多列和行的大型数据库的小片段。@Tanuki我会在这里将这行替换为字符串输入(“谷歌,谷歌公司,$568.77,$570.25,$560.35”);输入(行)“Tanuki谢谢你,我要深入看看。这一切都是打印流。他希望它被格式化,就像他在他的问题中显示。1秒。我会改变样品。”Tunui抱歉如果这是显而易见的,我是C++初学者,但是上面的代码是作为输入的吗?
string NameSearch::getInput()
{
cout << "Enter the name of the company you would like to search for: ";
getline(cin, input);
return input;
}
void NameSearch::NameAlgorithm()
{
string line;
ifstream fs("Stock Database.csv");
while (!fs.eof())
{
getline(fs, line);
string companyname = "";
string a;
int column = 1;
int commacount = 0;
int ChrCount = 0;
while (line != "\0")
{
a = line[ChrCount];
ChrCount++;
if (a == ",")
{
commacount++;
}
else if (commacount == column)
{
companyname.append(a);
}
else if (commacount > column)
{
break;
}
if (companyname == input)
{
cout << endl << line;
}
}
}
}
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
typedef std::vector<std::string> record;
std::istream&
operator>>(
std::istream& is,
record& r)
{
r.clear();
string line;
getline(is, line);
istringstream iss(line);
string field;
while (getline(iss, field, ',' ))
r.push_back(field);
return is;
}
int
main()
{
ifstream file("Stock Database.csv");
record headers, r;
if (file.good())
file >> headers;
while (file >> r)
{
for (int i = 0; i < r.size(); i++)
cout << headers[i] << ":\t" << r[i] << endl;
cout << "------------------------------" << endl;
}
return 0;
}
// EOF
Symbol,Name,Price,High Today,Low Today,52 Week Low
GOOG,Google Inc.,$568.77 ,$570.25 ,$560.35
AAPL,Apple Inc.,$93.28 ,$63.89 ,$99.44