在C++中读取制表符分隔文件并将每行存储为记录的最佳方法是什么?我一直在寻找一个开源库来帮助解决这个问题,但是一直没有成功,所以看起来我必须自己编写.
这是一件非常简单的事情,所以我想保持它听起来很简单.我想要的只是从文件中加载一堆键值派,并将它们填充到地图中.我不关心文本的结构,只要它易于阅读.
我现在拥有的是:
我喜欢INI文件的语法,但我不想为此编写解析器.听起来像我会做很多人在我面前做过的事情.是不是有某种类型的库来读取这样的简单结构化文件?
如果有人问过这个我很抱歉,但我似乎找不到能帮助我的解决方案.我正在尝试从文本文件中读取数据,并最终将其存储在对象中.
文本文件有4个变量,全部用逗号分隔.
我试过这样做如下:
string v1, v2, v3, v4;
ifstream afile;
afile.open("thefile.txt");
afile >> v1 >> v2 >> v3 >> v4;
afile.close();
cout << v1 << endl;
cout << v2 << endl;
cout << v3 << endl;
cout << v4 << endl;
Run Code Online (Sandbox Code Playgroud)
该文件有多个记录.我试图现在只做1以确保它有效,但是当它读入数据时,它不会在逗号中分开.
从那里,我想将数据存储到一个对象中.以下工作:Thing*thing1 = new Thing(v1,v2,v3,v4);
虽然,当我读到5条记录时,构建上述代码行的最佳方法是什么?由于每个对象都需要一个唯一的名称,有没有办法可以使用for循环和向量进行迭代?ie for(int i = 0; i <5; i ++){//读入数据//存储在vector中}
非常感谢任何提示
很抱歉提出许多人可能认为已经被问过的问题.
我有一个很长的CSV数据文件(dat.csv),有5列.我有另一个简短的CSV(filter.csv)文件,其中包含1列.
现在,我只需要从dat.csv中提取列,其中column-1与filter.csv的column-1匹配.
我通常会在BASH中使用sed/awk.但是,由于某些其他原因,我需要在C++文件中执行此操作.你能建议一种有效的方法吗?
样本数据:
data.csv
Run Code Online (Sandbox Code Playgroud)ID,Name,CountryCode,District,Population 3793,NewYork,USA,NewYork,8008278 3794,LosAngeles,USA,California,3694820 3795,Chicago,USA,Illinois,2896016 3796,Houston,USA,Texas,1953631 3797,Philadelphia,USA,Pennsylvania,1517550 3798,Phoenix,USA ,Arizona,1321045 3799,SanDiego,USA,California,1223400 3800,Dallas,USA,Texas,1188580 3801,SanAntonio,USA,Texas,1144646
filter.csv
Run Code Online (Sandbox Code Playgroud)3793 3797 3798
我有一个格式如下的 CSV 文件:
1,50,a,46,50,b
2, 20,s,56,30,f
3,35,b,5,67,s
...
Run Code Online (Sandbox Code Playgroud)
我怎样才能把它变成一个二维数组,以便我可以做一些计算?
void Core::parseCSV(){
std::ifstream data("test.csv");
std::string line;
while(std::getline(data,line))
{
std::stringstream lineStream(line);
std::string cell;
while(std::getline(lineStream,cell,','))
{
//not sure how to create the 2d array here
}
}
};
Run Code Online (Sandbox Code Playgroud) 我有一个函数可以逐行读取 CSV 文件。对于每一行,它将把该行分割成一个向量。执行此操作的代码是
std::stringstream ss(sText);
std::string item;
while(std::getline(ss, item, ','))
{
m_vecFields.push_back(item);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,除非它读取最后一个值为空的行。例如,
text1,tex2,
Run Code Online (Sandbox Code Playgroud)
我希望它返回一个大小为 3 的向量,其中第三个值只是空。然而,它只是返回一个大小为 2 的向量。我该如何纠正这个问题?
嗨,我需要读一个看起来像这样的文件......
1|Toy Story (1995)|Animation|Children's|Comedy
2|Jumanji (1995)|Adventure|Children's|Fantasy
3|Grumpier Old Men (1995)|Comedy|Romance
4|Waiting to Exhale (1995)|Comedy|Drama
5|Father of the Bride Part II (1995)|Comedy
6|Heat (1995)|Action|Crime|Thriller
7|Sabrina (1995)|Comedy|Romance
8|Tom and Huck (1995)|Adventure|Children's
9|Sudden Death (1995)|Action
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,每部电影的类型可以从1种变化到很多......我想知道在每行结束之前我怎么能读到这些?
我现在正在做:
void readingenre(string filename,int **g)
{
ifstream myfile(filename);
cout << "reading file "+filename << endl;
if(myfile.is_open())
{
string item;
string name;
string type;
while(!myfile.eof())
{
getline(myfile,item,'|');
//cout <<item<< "\t";
getline(myfile,name,'|');
while(getline(myfile,type,'|'))
{
cout<<type<<endl;
}
getline(myfile,type,'\n');
}
myfile.close();
cout << "reading genre file finished" <<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
结果不是我想要的......它看起来像: …
我尝试了其他答案中提到的一些修复,但它们对我的输出没有影响。我不打算使用 boost 精神,因为我不确定它是否是满足我需求的最佳选择。此外,类似的帖子不涉及包含逗号的引用材料,这是我目前要解决的最后一个问题。
这是一个 C++ 程序。我使用 CSV 文件作为输入。该文件给出了印章的特征,每个条目有 23 个值(列)。当我输出 rawdata[22] 时,我希望看到第一组数据的最后一个条目。相反,我看到最后一个条目(请愿),然后是下一个印章的第一个条目(2055)。当我在十六进制编辑器中打开它时,我看到这两个词被一个“。”隔开。并且十六进制字符是 0a。我曾尝试将 \r、\n、\r\n 设置为分隔符,但它们不起作用。我不能使用“,”作为分隔符,因为它在字符串中使用,我测试了它是否可以解决我的问题,但它没有。如何分离这些值?
输出:
Petitioned
2055
样本输入:
物种 ID、王国、门、类、顺序、科、属、物种、权威、种下等级、种下名称、种下权威、种群/亚群、同义词、通用名称 (Eng)、通用名称 (Fre)、通用名称 (Spa) ,红色名录状态,红色名录标准,红色名录标准版本,评估年份,人口趋势,请愿 2055,动物,脊索动物,哺乳动物,食肉动物,蛱蝶科,Arctocephalus,australis,"(Zimmermann, 1783)",,,,,Arctophoca australis,South American Fur Seal,Otarie Fourrure Australe,Oso Marino Austral,LC,16. , 增加, N 41664,ANIMALIA,CHORDATA,MAMMALIA,CARNIVORA,OTARIIDAE,Arctocephalus,forsteri,"(Lesson, 1828)",,,,,Arctocephalus australis subspecies forsteri|Arctophoca australis subspecies forsteri,Antipodocephalis subspecies forsteri,"新西兰毛皮海豹,"新西兰毛皮海豹Seal, Black Fur Seal, Long-nosed Fur Seal, South Australia Fur Seal",,,LC,,3.1,2015,increasing,N
我的代码:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string line;
vector<string> rawdata;
ifstream …Run Code Online (Sandbox Code Playgroud) 我目前正在学习 C++ 并且正在努力理解流。今天我学到了一个很酷的东西,你可以将一个字符串流拆分为多个浮点数/整数,例如:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
stringstream ss("1 2.2");
int val1; float val2;
ss >> val1 >> val2;
cout << "val1: " << val1 << endl
<< "val2: " << val2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在出现了一个问题,当我使用“1,2.2”代替“1 2.2”作为输入字符串时,这类似于我从 csv 文件中得到的内容。我希望能够编写一些内容,将这样的 csv 字符串转换为与上面示例中相同类型的流。我想它看起来像
ss >> mySpecialPipe >> val1 >> val2;
Run Code Online (Sandbox Code Playgroud)
现在我知道mySpecialPipe应该做几件事:
所以我试图建立这个:
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
class MySpecialPipe {
private:
char delimiter;
public:
vector<string> …Run Code Online (Sandbox Code Playgroud)