gpt4 book ai didi

c++ - 如何使用 C++ 在 CSV 文件上执行逐行操作(一些 x)

转载 作者:行者123 更新时间:2023-11-28 05:54:57 24 4
gpt4 key购买 nike

我一直在为整行(\n 或\r)而苦苦挣扎,我被分配了一项任务来读取一个包含 4K 行的 .csv 文件..出于好奇,我找到了阅读的方法csv 文件并将每个字段/单词与分隔符“,”分开。

std::istream& safeGetline(std::istream& is, std::string& t)
{
t.clear();
std::istream::sentry se(is);
std::streambuf* sb = is.rdbuf();

for(;;) {
int c = sb->sbumpc();
switch (c) {
case '\r':
if(sb->sgetc() == '\n')
sb->sbumpc();
return is;
case EOF:
// Also handle the case when the last line has no line ending
if(t.empty())
is.setstate(std::ios::eofbit);
return is;
default:
t += (char)c;
}
}
}

int main()
{
cout<<"Enter the file path :";
string filename;
cin>>filename;
ifstream file;
file.open(filename.c_str(),ios::in);
vector<string>arr;
string content;
string arr2;
stringstream ss;
// sqlite3 *db;int rc;sqlite3_stmt * stmt;
int i=0;
while (!safeGetline(file,content).eof())--here is the problem
{
ss<<content;
//since some of the field content falls next line i have decided to remove the '\n'
content.erase(std::remove(content.begin(), content.end(), '\n'), content.end());
while (getline(ss,arr2,','))
{
arr.push_back(arr2);
}
}
}

这里 while (!safeGetline(file,content).eof())——我认为这段代码将从 CSV 文件中读取第一行并通过 while (getline (ss,arr2,',')) 用于分隔符分隔,但发生的是 safeGetline() 以及正常的 getline()- - 我之前尝试过,而不是 safeGetline() 读取全部内容并通过定界符分隔部分,这让我很难将这些字段插入数据库

例如:

4xxxxxx,"field2",field3,,,,field7
400x1x2,"field2",,field4,,,field7

代码开始读取后,while (!safeGetline(file,content).eof()) 返回

输出:

4xxxxxx,"field2",field3,,,,field7400x1x2,"field2",,field4,,,field7

此处 field7 和出现在第二行的值 400x1x2 组合在一起 field7400x1x2——当我将这些字段插入到我的表中时,这给出了虚假结果(即值在表。

那么在我的例子中,我如何真正执行逐行读取操作(即)读取->单独的定界符->推送到 vector ->插入表->第二次读取->.....

最佳答案

你的 switch 语句

    switch (c) {
case '\r':
if(sb->sgetc() == '\n')
sb->sbumpc();
return is;
case EOF:
// Also handle the case when the last line has no line ending
if(t.empty())
is.setstate(std::ios::eofbit);
return is;
default:
t += (char)c;
}

仅检测 '\r' 或 '\r\n' 大小写。它无法单独处理带有 '\n' 字符的文件。

所以改成这样:

    case '\n':
case '\r':
if(sb->sgetc() == '\n' || sb->sgetc() == '\r')
sb->sbumpc();
return is;

关于c++ - 如何使用 C++ 在 CSV 文件上执行逐行操作(一些 x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com