C++ 从文件中读取双引号
C++ Read double quotation marks from a file
所以我尝试使用 C++ 读取一个 csv 文件并进行一些计算并输出到另一个 csv 文件。
一切正常,但是当程序读取一行时:
<a href="http://www.google.com" target="_blank">google</a>
我想看看程序读取了什么,所以我计算出那个字符串,它显示:
<a href=""http://www.google.com"" target=""_blank"">google</a>
基本上每个双引号加倍?
我该如何解决?
编辑:
这是我的代码:
int main()
{
ifstream read;
ofstream write;
string line;
string cell;
int col = 0;
string temp;
string links;
read.open("Book1.csv");
write.open("output.csv");
if (read.is_open())
{
cout << "opened" <<endl ;
getline(read, line);
while(getline(read,temp))
{
stringstream line(temp);
while (getline(line, cell, ','))
{
if (col > 9)
{
links.pop_back();
write << links<<endl;
col = 0;
links = "";
break;
}
else
{
if (cell != "")
{
if (col == 0)
{
write << cell<<',';
}
else if (col == 1)
{
write << cell<<',';
}
else
{
cell.erase(0, 1);
cell.pop_back();
links += cell;
links += '/';
}
cout << cell << endl;
}
col += 1;
}
}
}
}
else
{
cout << "failed" << endl;
}
read.close();
write.close();
}
这是完全正常的。字段内的引号(在您的 csv 文件内)用另一个引号转义以生成有效的 csv。
考虑这个 csv 数据:
123,"monitor 27"", Samsung",456
由于第二个字段包含 ,
,因此需要用引号将其引用。但是因为字段中有引号,所以需要用另一个引号转义。
因此,添加额外引号的不是阅读,它们已经在您的 csv 中(但 csv 查看器在解析后只会显示一个引号)。
如果您要将此字符串输出到另一个 csv,您可以(需要)保留双引号,只需确保整个字段也被引号括起来。
更新(贴出代码后):
首先,我假设您发布的第二个字符串也用这样的引号引起来:
"<a href=""http://www.google.com"" target=""_blank"">google</a>"
否则你将得到无效的 csv 数据。
要解析 csv,我们不能只拆分每个 ,
,因为字段中可能有一个。
假设我们有以下字段:
123
monitor 27", Samsung
456
要将这些写入有效的 csv 行,第二个字段必须用引号括起来,因为里面有一个逗号。如果引用字段中有引号,则需要用另一个引号将其转义。所以我们得到这个:
123,"monitor 27"", Samsung",456
如果 27"
后没有第二个引号,csv 将无效且无法解析。
要正确扫描 csv 行,您需要检查每个字节。这是一些伪代码,它也将清楚为什么必须有 2 个引号(假设没有多行字段):
read a line
bool bInsideQuotes = false
loop over chars
if character == '"'
bInsideQuotes = !bInsideQuotes
if character == ',' and !bInsideQuotes
found a field separator
这样您就可以跳过字段中的 ,
。现在也很容易理解为什么字段中的引号需要用额外的引号转义:bInsideQuotes
在 27"
处变为 false
,第二个引号 (27""
) 强制bInsideQuotes
再次成为 true
(我们仍在一个字段中)。
现在,无需更改任何内容即可写回原始字符串。只需在从原始文件中读取它时将其写入第二个文件,您的 csv 将保持有效。
要使用该字符串,请删除 2 个外部引号并将每 2 个引号替换为 1 个引号。
所以我尝试使用 C++ 读取一个 csv 文件并进行一些计算并输出到另一个 csv 文件。 一切正常,但是当程序读取一行时:
<a href="http://www.google.com" target="_blank">google</a>
我想看看程序读取了什么,所以我计算出那个字符串,它显示:
<a href=""http://www.google.com"" target=""_blank"">google</a>
基本上每个双引号加倍? 我该如何解决?
编辑:
这是我的代码:
int main()
{
ifstream read;
ofstream write;
string line;
string cell;
int col = 0;
string temp;
string links;
read.open("Book1.csv");
write.open("output.csv");
if (read.is_open())
{
cout << "opened" <<endl ;
getline(read, line);
while(getline(read,temp))
{
stringstream line(temp);
while (getline(line, cell, ','))
{
if (col > 9)
{
links.pop_back();
write << links<<endl;
col = 0;
links = "";
break;
}
else
{
if (cell != "")
{
if (col == 0)
{
write << cell<<',';
}
else if (col == 1)
{
write << cell<<',';
}
else
{
cell.erase(0, 1);
cell.pop_back();
links += cell;
links += '/';
}
cout << cell << endl;
}
col += 1;
}
}
}
}
else
{
cout << "failed" << endl;
}
read.close();
write.close();
}
这是完全正常的。字段内的引号(在您的 csv 文件内)用另一个引号转义以生成有效的 csv。
考虑这个 csv 数据:
123,"monitor 27"", Samsung",456
由于第二个字段包含 ,
,因此需要用引号将其引用。但是因为字段中有引号,所以需要用另一个引号转义。
因此,添加额外引号的不是阅读,它们已经在您的 csv 中(但 csv 查看器在解析后只会显示一个引号)。
如果您要将此字符串输出到另一个 csv,您可以(需要)保留双引号,只需确保整个字段也被引号括起来。
更新(贴出代码后):
首先,我假设您发布的第二个字符串也用这样的引号引起来:
"<a href=""http://www.google.com"" target=""_blank"">google</a>"
否则你将得到无效的 csv 数据。
要解析 csv,我们不能只拆分每个 ,
,因为字段中可能有一个。
假设我们有以下字段:
123
monitor 27", Samsung
456
要将这些写入有效的 csv 行,第二个字段必须用引号括起来,因为里面有一个逗号。如果引用字段中有引号,则需要用另一个引号将其转义。所以我们得到这个:
123,"monitor 27"", Samsung",456
如果 27"
后没有第二个引号,csv 将无效且无法解析。
要正确扫描 csv 行,您需要检查每个字节。这是一些伪代码,它也将清楚为什么必须有 2 个引号(假设没有多行字段):
read a line
bool bInsideQuotes = false
loop over chars
if character == '"'
bInsideQuotes = !bInsideQuotes
if character == ',' and !bInsideQuotes
found a field separator
这样您就可以跳过字段中的 ,
。现在也很容易理解为什么字段中的引号需要用额外的引号转义:bInsideQuotes
在 27"
处变为 false
,第二个引号 (27""
) 强制bInsideQuotes
再次成为 true
(我们仍在一个字段中)。
现在,无需更改任何内容即可写回原始字符串。只需在从原始文件中读取它时将其写入第二个文件,您的 csv 将保持有效。
要使用该字符串,请删除 2 个外部引号并将每 2 个引号替换为 1 个引号。