現象
以下のようなコードでCSVで読み込んだ際に余計な文字列が入る現象が発生しました。
#include <iostream> #include <string> #include <sstream> #include <vector> std::ifstream ifs; ifs.open(CSVpath.c_str()); std::string value; std::vector<std::string > values; bool isOpen = ifs.is_open();//正常なデータを開けたか if (isOpen) { //一行読み込みテスト // std::getline(ifs, value); //全データを読み込む while (std::getline(ifs, value, ',')) { if(value != "/n") values.push_back(value); } }
こんな感じになる。
CのFILEでのCSV読み込みもこうなります。
原因
文字コードが問題でした
csvをUTF-8で保存してたらBOM(先頭の数バイトにどの種類の符号化形式)があるためそれも一緒に読み込んでしまうため、CSVで読み込んだ際に余計な文字列が入ってしまいます。
参考URL
対策
・csvを直接修正
メモ帳でcsvをひらいてそのまま上書き保存、または名前を付けて保存で文字コードをASCIIにして保存すればOKです。
参考URL
・コードでcsvを読み込む場合の修正
csvを詠み込んだ際、最初の数bitをみて文字コードが問題ないかを調べるとか。
・コードでcsvを書き出す際の修正
C#ならStreamWriterの引数をEncoding.ASCIIにすればいいです。
using System.IO; /// <summary> /// CSVにデータを書き込む /// </summary> /// <param name="List"></param> public void Save() { StreamWriter file = new StreamWriter(s, false, Encoding.ASCII); file.Write("0"+ "," + "1" + "," + "\n"); file.Close(); }
c++は調べたけどわかりませんでした、、、、
おまけ
ちなみにC#のStreamReaderでCSVを読み込む際はUTF-8のBOMは無視されるぽいです。 c++もそうしてくれー