C++でCSVファイルを読み込み・解析する2つの方法を解説
C++でCSVファイルを解析する場合、自分でファイルを読み込んで処理するよりも、ライブラリを利用することを強くおすすめします。CSVは一見単純な形式に見えますが、引用符で囲まれたカンマやエスケープ処理など、考慮すべきケースが数多く存在します。自前で実装すると、こうしたエッジケースを見落としてしまう可能性が高くなります。
C++向けのBoostライブラリには、CSVファイルを読み込むための便利なツールセットが用意されています。
Boost.Tokenizerを使った解析方法
以下は、Boostのtokenizerとescaped_list_separatorを使用して、1行のCSVデータを解析する例です。
#include<iostream>
vector<string> parseCSVLine(string line){
using namespace boost;
std::vector<std::string> vec;
// 入力文字列をトークン化する
tokenizer<escaped_list_separator<char>> tk(line, escaped_list_separator<char>
('\\', ',', '\"'));
for (auto i = tk.begin(); i != tk.end(); ++i)
vec.push_back(*i);
return vec;
}
int main() {
std::string line = "hello,from,here";
auto words = parseCSVLine(line);
for(auto it = words.begin(); it != words.end(); it++) {
std::cout << *it << std::endl;
}
}
実行結果
hello from here
escaped_list_separatorの引数は、順に「エスケープ文字」「フィールド区切り文字」「引用符」を表しています。この仕組みにより、引用符の中に含まれるカンマなども正しく処理できます。
getline関数と区切り文字を使った方法
もうひとつの方法として、標準ライブラリだけで完結するシンプルな手法があります。getline関数に独自の区切り文字(デリミタ)を指定し、文字列を分割して配列に格納します。
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
std::stringstream str_strm("hello,from,here");
std::string tmp;
vector<string> words;
char delim = ','; // 分割に使う区切り文字を定義
while (std::getline(str_strm, tmp, delim)) {
// tmpに対するチェック(空文字列の確認など)をここで行う
// 「!」「.」「?」などの記号を取り除く処理も必要に応じて追加
// 最後にベクターへ格納する
words.push_back(tmp);
}
for(auto it = words.begin(); it != words.end(); it++) {
std::cout << *it << std::endl;
}
}
実行結果
hello from here
どちらの方法を選ぶべきか?
カンマ区切りの単純なデータであれば、getlineを使った方法でも十分対応できます。一方、引用符やエスケープ文字を含む本格的なCSVデータを扱う場合は、Boostのようなライブラリを活用した方が安全で確実です。実際のプロジェクトでは、扱うデータの形式に応じて適切な方法を選択しましょう。
-
PythonでUnicode(UTF-8)ファイルを読み書きする方法を徹底解説
PythonでUnicode(UTF-8)形式のファイルを読み書きするには、標準ライブラリのioモジュールを使用するのが推奨されています。io.open()はPython 3の組み込みopen()関数と互換性があり、エンコーディングを明示的に指定できるため、文字化けや予期しないエラーを防ぐことができます。 基本的な読み書きの例 以下のコードは、ioモジュールを使ってUnicode(UTF-8)ファイルの読み書きを行う基本的な例です。 import io # UTF-8でエンコードされたファイルを読み込む with io.open(filename, r, encoding=utf8) as
-
RubyでCSVファイルを読み取って解析する方法【基本から応用まで】
CSVとは「Comma-Separated Values(カンマ区切り値)」の略称です。 カンマで区切った値を1行ずつ並べた、広く使われているデータ形式で、データのインポートやエクスポートに活用されています。 例えば、Gmailの連絡先はCSVファイルとしてエクスポートでき、同じ形式でインポートすることも可能です。 CSVファイルは次のような構造になっています: id,name 1,chocolate 2,bacon 3,apple 4,banana 5,almonds この記事では、RubyのCSVライブラリを使ってCSVファイルを読み書きする方法を解説します。 RubyでのCSV解析の