C++ CSV解析与c++;

C++ 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美元 代码: 字符串名称搜

我正在尝试创建一个代码,通过csv数据库解析股票信息。目前,我已经生成了代码,这样它将使用关键字搜索并打印整行,但我正在尝试获取它,以便它将以整洁的格式打印整行和标题行

我正在尝试获取它,这样如果我搜索谷歌,它就会返回

符号GOOG
名称谷歌公司
今日高点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