データベースに登録
ここまでくればあとはどうにでもなりますな。','区切りで出力すればCSVだからexcelに食わせられるし。データベースに流し込みたいとの依頼ですから、テキトーなDBを見繕うことにします。軽量DBで定評のあるSQLiteを使いましょうか。SQLiteはサーバ不要、ライブラリ1つリンクするだけで動くのでお試しにはもってこいです。本番ではOracleなりSQL Serverなりに差し替えてもらえばいいし(なんならそのままSQLiteでも構わんし)。
#include <iostream>
#include <sstream>
#include <locale>
#include <string>
#include <vector>
#include <tuple>
#include <iterator>
#include <algorithm>
// SQLite
#include <sqlite3.h>
using namespace std;
typedef tuple<wstring,wstring> word_type;
// DB上にテーブルを作る
void create_table(sqlite3* db) {
sqlite3_stmt* statement;
const wchar_t* command = L"CREATE TABLE IF NOT EXISTS word ( en TEXT, ja TEXT)";
sqlite3_prepare16_v2(db, command, -1, &statement, 0);
sqlite3_step(statement);
sqlite3_finalize(statement);
}
// en,ja をテーブルに挿入
template<typename InputIterator>
void insert_word(InputIterator first, InputIterator last, sqlite3* db) {
sqlite3_stmt* statement;
const wchar_t* command = L"INSERT INTO word VALUES ( ?, ? )";
sqlite3_prepare16_v2(db, command, -1, &statement, 0);
for_each(first, last,
[=](const word_type& word) {
sqlite3_reset(statement);
sqlite3_bind_text16(statement, 1, get<0>(word).c_str() , -1, SQLITE_STATIC);
sqlite3_bind_text16(statement, 2, get<1>(word).c_str() , -1, SQLITE_STATIC);
sqlite3_step(statement);
});
sqlite3_finalize(statement);
}
// 登録されている全wordを取り出す
template<typename OutputIterator>
OutputIterator enumerate_word(sqlite3* db, OutputIterator out) {
sqlite3_stmt* statement;
const wchar_t* command = L"SELECT * FROM word";
sqlite3_prepare16_v2(db, command, -1, &statement, 0);
while ( sqlite3_step(statement) == SQLITE_ROW ) {
*out++ = word_type(static_cast<const wchar_t*>(sqlite3_column_text16(statement,0)),
static_cast<const wchar_t*>(sqlite3_column_text16(statement,1)));
}
sqlite3_finalize(statement);
return out;
}
const string db_path = "wordbook.db";
int main() {
locale ja("japanese");
wcout.imbue(ja);
vector<word_type> words;
words.push_back(word_type(L"pencil",L"えんぴつ"));
words.push_back(word_type(L"eraser",L"けしごむ"));
sqlite3* db;
sqlite3_open(db_path.c_str(), &db);
create_table(db);
insert_word(begin(words), end(words), db);
words.clear();
enumerate_word(db, back_inserter(words));
wcout << L"----------- now I have these words ------------------" << endl;
for_each(begin(words), end(words),
[](const word_type& word) { wcout << get<0>(word) << L',' << get<1>(word) << endl; });
sqlite3_close(db);
}
