私はC ++でCSVファイルを読んでおり、行の形式は次のとおりです。
「プライマリ、セカンダリ、サード」、「プライマリ」、、「セカンダリ」、18、4、0、0、0
(空の値に注意してください)
私がする時:
while (std::getline(ss, csvElement, ',')) {
csvColumn.push_back(csvElement);
}
これにより、最初の文字列が正しくない部分に分割されます。
反復するときに文字列を保持するにはどうすればよいですか?上記を組み合わせて、二重引用符で区切られた行を取得しようとしましたが、ワイルドな結果が得られました。
引用符の間にあるかどうかに応じて、コンマを解釈する必要があります。これは複雑すぎますgetline()
。
解決策は、を使用して行全体を読み取り、getline()
文字列を1文字ずつ反復して行を解析し、二重引用符の間にあるかどうかを示すインジケーターを維持することです。
これが最初の「生の」例です(二重引用符はフィールドで削除されず、エスケープ文字は解釈されません):
string line;
while (std::getline(cin, line)) { // read full line
const char *mystart=line.c_str(); // prepare to parse the line - start is position of begin of field
bool instring{false};
for (const char* p=mystart; *p; p++) { // iterate through the string
if (*p=='"') // toggle flag if we're btw double quote
instring = !instring;
else if (*p==',' && !instring) { // if comma OUTSIDE double quote
csvColumn.push_back(string(mystart,p-mystart)); // keep the field
mystart=p+1; // and start parsing next one
}
}
csvColumn.push_back(string(mystart)); // last field delimited by end of line instead of comma
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加