【VC++】カンマ区切り文字列を分割する
<機能>
(1)strtok_s を使用してカンマ区切り文字列を分割します
(2)AfxExtractSubStringを使用してカンマ区切り文字列を分割します
(3)カンマ区切り文字列を分割した結果をコマンドプロンプトに出力します
<動作検証&開発環境>
Visual Studio Community 2015
<イメージ>
上がCSVをstrtok_s を使用して分割した結果
下がCSVをAfxExtractSubStringを使用して分割した結果
<使い方>
(1)Win32コンソールアプリケーションでプロジェクトを作成
(2)[次へ]を押下し、アプリケーション設定画面の共通ヘッダーファイルを追加にて「MFC」にチェック
(3)構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を指定
(4)ソースの追加
//テスト用CSVデータを定義
//りんごの収穫量ランキングベスト10(2014年)
//農水省統計データより引用
//http://www.machimura.maff.go.jp/machi/search/index.php
char *cApple[] = {
"1,青森県 ,468000",
"2,長野県 ,162900",
"3,山形県 ,52400",
"4,岩手県 ,46500",
"5,福島県 ,27600",
"6,秋田県 ,22100",
"7,群馬県 ,9050",
"8,北海道 ,8450",
"9,宮城県 ,3840",
"10,栃木県 ,3060",
"0,"
};
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// MFC を初期化して、エラーの場合は結果を印刷します。
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 必要に応じてエラー コードを変更してください。
wprintf(L"致命的なエラー: MFC の初期化ができませんでした。¥n");
nRetCode = 1;
}
else
{
/* 【 C++言語編 】 */
/* (1)strtok_sを使って文字列を分割 */
/* Developer Networkはこちら */
/* https://msdn.microsoft.com/ja-jp/library/ftsafwz3.aspx */
printf("(1)strtok_sを使って文字列を分割¥n");
char apple[1024];
char buf[1024];
char cwk[1024];
//デリミタ(区切り文字)にカンマを指定
char deli[] = ",";
//char deli[] = "¥t"; //タブを指定する場合
//char deli[] = " ,¥t" //半角スペースとカンマとタブを指定する場合
//トークン
char *token = NULL;
char *next = NULL;
for (int i=0;;i++){
ZeroMemory(&buf, sizeof(buf));
//最初のカンマ区切り文字取得
ZeroMemory(&apple, sizeof(apple));
strcpy_s(apple, sizeof(apple), cApple[i]);
token = strtok_s(apple, deli, &next);
//ループ終了条件(0が出現したら終了)
if (strcmp(token, "0") == 0) break;
//取得したトークンを保持
strcpy_s(buf, sizeof(buf), token);
//次のトークンを取得
while (1) {
ZeroMemory(&cwk, sizeof(cwk));
token = strtok_s(NULL, deli, &next);
//トークンがNULLなら取得終了
if (token == NULL) break;
sprintf_s(cwk, " %s", token);
strcat_s(buf, sizeof(cwk) - strlen(cwk) - 1, cwk);
}
//コンソール出力
printf("%02dレコード目--> %s ", (i + 1), buf);
system("pause");
}
/* 【 MFC編 】 */
/* (2)AfxExtractSubStringを使って文字列を分割 */
/* Developer Networkはこちら */
/* https://msdn.microsoft.com/ja-jp/library/aa991543.aspx */
printf("¥n(2)AfxExtractSubStringを使って文字列を分割¥n");
CString csapple;
CString csbuf;
CString cswk;
for (int i = 0;; i++) {
csbuf = "";
//最初のカンマ区切り文字取得
//最終データを取得するため最後尾にカンマを付加する
csapple.Format("%s,,,", cApple[i]);
if (csapple.Left(1) == "0") break;
//カンマ区切りデータを取得
for (int j = 0; j < 3;j++) {
cswk = "";
AfxExtractSubString(cswk, csapple, j, ',');
csbuf += (cswk + " ");
}
//最後尾にスペースを付加
csbuf += " ";
//コンソール出力
printf("%02dレコード目--> %s", (i + 1), (LPCSTR)csbuf);
system("pause");
}
}
}
else
{
// TODO: 必要に応じてエラー コードを変更してください。
wprintf(L"致命的なエラー: GetModuleHandle が失敗しました¥n");
nRetCode = 1;
}
return nRetCode;
}
よろしければポチッと押してください