「C言語/サンプル/文字列置換 CSVファイルに格納する値の変換」の編集履歴(バックアップ)一覧はこちら

C言語/サンプル/文字列置換 CSVファイルに格納する値の変換」(2012/09/23 (日) 22:38:35) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*** 解説 - CSVファイルに"を入れるためのエンコード、デコード処理のサンプルです。 ルール - CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する - 読み込む場合は、逆に変換して元の値に戻す やること - 文字列変換関数を作って、変換するだけ。。。。 *** ソース #highlight(c){{ // CSVファイルに"を入れるためのエンコード、デコード処理 // ルール CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する // 読み込む場合は、逆に変換して元の値に戻す // やること 文字列変換関数を作って、変換するだけ。。。。 #include <stdio.h> #include <stdlib.h> #include <string.h> // 文字列置換関数 // パラメータ 1.対象文字列 2.変換結果格納バッファ 3.変換前文字列 4.変換後文字列 void chikan(const char *target, char *result, const char *before, const char *after) { char *p; int i = 0, size; int beforeSize = strlen(before); // 変換後の格納バッファを空っぽにする result[0] = '\0'; // 検索結果がなくなるまでループを回す while (NULL != (p = strstr(&target[i], before))) { // 検索結果と処理済みカウンタからコピーする文字数を決める size = p - &target[i]; // 検索結果の手前まで文字列をコピー strncat(result, &target[i], size); // 変換後文字列を追加する strcat(result, after); // カウンタにコピーした文字数と変換前文字列の文字数を追加する i = i + beforeSize + size; } // 検索結果の残りをresultに全部足す strcat(result, &target[i]); } int main(void) { // "と\を\"と\\にエンコード・デコードします char *target = "\",\"\\ \\\\"; char r1[200], r2[200], r3[200], r4[200]; char *before, *after; // エンコード printf("エンコード処理\n"); // まず\を\\に変換します printf(" エンコード前の値 %s\n", target); before = "\\"; after = "\\\\"; chikan(target, r1, before, after); printf(" エンコード中の値 %s\n", r1); before = "\""; after = "\\\""; chikan(r1, r2, before, after); printf(" エンコード後の値 %s\n", r2); printf("デコード処理\n"); printf(" デコード前の値 %s\n", r2); // デコード // \\を\に戻す before = "\\\\"; after = "\\"; chikan(r2, r3, before, after); printf(" デコード中の値 %s\n", r3); // \"を"に戻す before = "\\\""; after = "\""; chikan(r3, r4, before, after); printf(" デコード後の値 %s\n", r4); return EXIT_SUCCESS; } }} *** 実行結果 #highlight(){{ エンコード処理  エンコード前の値 ","\ \\  エンコード中の値 ","\\ \\\\  エンコード後の値 \",\"\\ \\\\ デコード処理  デコード前の値 \",\"\\ \\\\  デコード中の値 \",\"\ \\  デコード後の値 ","\ \\ }} *** ideone ソースとかここからコピペできるかも http://ideone.com/0hIJC
*** 解説 - CSVファイルに"を入れるためのエンコード、デコード処理のサンプルです。 ルール - CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する - 読み込む場合は、逆に変換して元の値に戻す やること - 文字列変換関数を作って、変換するだけ。。。。 *** ソース &ref(edCsv.c) #highlight(c){{ // CSVファイルに"を入れるためのエンコード、デコード処理 // ルール CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する // 読み込む場合は、逆に変換して元の値に戻す // やること 文字列変換関数を作って、変換するだけ。。。。 #include <stdio.h> #include <stdlib.h> #include <string.h> // 文字列置換関数 // パラメータ 1.対象文字列 2.変換結果格納バッファ 3.変換前文字列 4.変換後文字列 void chikan(const char *target, char *result, const char *before, const char *after) { char *p; int i = 0, size; int beforeSize = strlen(before); // 変換後の格納バッファを空っぽにする result[0] = '\0'; // 検索結果がなくなるまでループを回す while (NULL != (p = strstr(&target[i], before))) { // 検索結果と処理済みカウンタからコピーする文字数を決める size = p - &target[i]; // 検索結果の手前まで文字列をコピー strncat(result, &target[i], size); // 変換後文字列を追加する strcat(result, after); // カウンタにコピーした文字数と変換前文字列の文字数を追加する i = i + beforeSize + size; } // 検索結果の残りをresultに全部足す strcat(result, &target[i]); } int main(void) { // "と\を\"と\\にエンコード・デコードします char *target = "\",\"\\ \\\\"; char r1[200], r2[200], r3[200], r4[200]; char *before, *after; // エンコード printf("エンコード処理\n"); // まず\を\\に変換します printf(" エンコード前の値 %s\n", target); before = "\\"; after = "\\\\"; chikan(target, r1, before, after); printf(" エンコード中の値 %s\n", r1); before = "\""; after = "\\\""; chikan(r1, r2, before, after); printf(" エンコード後の値 %s\n", r2); printf("デコード処理\n"); printf(" デコード前の値 %s\n", r2); // デコード // \\を\に戻す before = "\\\\"; after = "\\"; chikan(r2, r3, before, after); printf(" デコード中の値 %s\n", r3); // \"を"に戻す before = "\\\""; after = "\""; chikan(r3, r4, before, after); printf(" デコード後の値 %s\n", r4); return EXIT_SUCCESS; } }} *** 実行結果 #highlight(){{ エンコード処理  エンコード前の値 ","\ \\  エンコード中の値 ","\\ \\\\  エンコード後の値 \",\"\\ \\\\ デコード処理  デコード前の値 \",\"\\ \\\\  デコード中の値 \",\"\ \\  デコード後の値 ","\ \\ }} *** ideone ソースとかここからコピペできるかも http://ideone.com/0hIJC

表示オプション

横に並べて表示:
変化行の前後のみ表示: