C ++从文件

时间:2016-02-09 19:16:18

标签: c++ csv double-quotes

所以我尝试使用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();  
}

1 个答案:

答案 0 :(得分:3)

这是完全正常的。字段内的引号(在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

这样你就可以跳过字段中的,。现在也很容易理解为什么需要使用额外引用来转义字段内的引号:bInsideQuotesfalse变为27",第二个引用(27"")强制bInsideQuotes再次成为true(我们仍然在一个字段内)。

现在,要写回原始字符串,您不必更改任何内容。当你从原始文件中读取它时,只需将它写入第二个文件,你的csv将保持有效。

要使用该字符串,请删除2个外部引号,并用1引号替换每2个引号。