// C言語/基本/CSVファイル読込sort出力
// CSVファイルを読み込んで、構造体に設定しソートしてから再度CSVファイルに出力するサンプルです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Record構造体
struct Record {
// インデックス
int idx;
// タイトル
char title[100];
// 日付
char date[11];
};
// CSVファイルから読み込んだ文字列をRecord構造体に設定します
void setRecord(struct Record* pR, const char* str) {
int i = 0, start = 1, size;
char* pStr;
char buff[100];
for (i = 0; i < 3; i++) {
// ","を探す
pStr
= strstr(&str
[start
], "\",\""); if (pStr == NULL ) {
// ","がない場合、最後の"を探す
pStr
= strstr(&str
[start
], "\"\n"); }
size = pStr - &str[start];
switch (i) {
case 0:
// インデックス
break;
case 1:
// タイトル
strncpy(pR
->title
, &str
[start
], size
); break;
case 2:
// 日付
strncpy(pR
->date
, &str
[start
], size
); break;
default:
break;
}
start = start + size + 3;
}
}
// Recordのソートを行います
// 今回は3番目の項目と1番目の項目の昇順にしました。
struct Record** sort(struct Record* pRecord, struct Record** out, int size) {
int i, j;
struct Record* ptmp;
int cmp;
// 出力用ポインタ配列にRecordのポインタをすべて設定する
for (i = 0; i < size; i++) {
out[i] = &pRecord[i];
}
for (i = 0; i < size - 1; i++) {
for (j = i + 1; j < size; j++) {
// 文字列比較
// ポイント2.2 構造体に入れたので好きな項目でソートできます
cmp
= strcmp(out
[i
]->date
, out
[j
]->date
); if (cmp > 0 || (cmp == 0 && out[i]->idx > out[j]->idx)) {
// 日付が、out[i] > out[j]の場合、もしくは
// 日付が同じで、インデックスがout[i] > out[j]の場合ポインタ入れ替え
ptmp = out[i];
out[i] = out[j];
out[j] = ptmp;
}
}
}
return out;
}
// CSVファイル出力
void output(FILE* fp, struct Record** out, int size) {
int i;
for (i = 0; i < size; i++) {
// ポイント3 カンマ区切りの文字列を作成して出力します
fprintf(fp
, "\"%d\",\"%s\",\"%s\"\n", out
[i
]->idx
, out
[i
]->title
, out[i]->date);
printf("\"%d\",\"%s\",\"%s\"\n", out
[i
]->idx
, out
[i
]->title
, out[i]->date);
}
}
int main(int argc, char *argv[]) {
char str[255];
// 構造体の配列
struct Record record[100];
// 構造体のポインタの配列(ソート用)
struct Record *sorted[100];
int i = 0, size;
// fopen(ファイル名, オプション)でファイルを開きます
FILE
* fp
= fopen(argv
[1], "r"); // ファイルを開けない場合、FILEのポインタがNULLになります
if (fp == NULL ) {
return EXIT_FAILURE;
}
// fgets(読み込むバッファ, バッファのサイズ, FILEのポインタ)で一行ずつ読み込みます
while (fgets(str
, 255, fp
)) { // 読み込んだ内容をそのまま出力
// ポイント1 読み込んだテキストを、分解して構造体の配列に設定します。
// Record構造体にデータを設定
setRecord(&record[i], str);
i++;
}
// 入力ファイルをクローズ
// サイズを保存
size = i;
// ポイント2 構造体の配列をソートします
sort(record, sorted, size);
// 出力ファイルを開きます
fp
= fopen(argv
[2], "w"); // ファイルを開けない場合、FILEのポインタがNULLになります
if (fp == NULL ) {
return EXIT_FAILURE;
}
// 出力ファイルに書き込みます
output(fp, sorted, size);
// 出力ファイルをクローズ
return EXIT_SUCCESS;
}
Ly8gQ+iogOiqni/ln7rmnKwvQ1NW44OV44Kh44Kk44Or6Kqt6L68c29ydOWHuuWKmwovLyBDU1bjg5XjgqHjgqTjg6vjgpLoqq3jgb/ovrzjgpPjgafjgIHmp4vpgKDkvZPjgavoqK3lrprjgZfjgr3jg7zjg4jjgZfjgabjgYvjgonlho3luqZDU1bjg5XjgqHjgqTjg6vjgavlh7rlipvjgZnjgovjgrXjg7Pjg5fjg6vjgafjgZnjgIIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8gUmVjb3Jk5qeL6YCg5L2TCnN0cnVjdCBSZWNvcmQgewoJLy8g44Kk44Oz44OH44OD44Kv44K5CglpbnQgaWR4OwoJLy8g44K/44Kk44OI44OrCgljaGFyIHRpdGxlWzEwMF07CgkvLyDml6Xku5gKCWNoYXIgZGF0ZVsxMV07Cn07CgovLyBDU1bjg5XjgqHjgqTjg6vjgYvjgonoqq3jgb/ovrzjgpPjgaDmloflrZfliJfjgpJSZWNvcmTmp4vpgKDkvZPjgavoqK3lrprjgZfjgb7jgZkKdm9pZCBzZXRSZWNvcmQoc3RydWN0IFJlY29yZCogcFIsIGNvbnN0IGNoYXIqIHN0cikgewoJaW50IGkgPSAwLCBzdGFydCA9IDEsIHNpemU7CgljaGFyKiBwU3RyOwoJY2hhciBidWZmWzEwMF07Cglmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CgkJLy8gIiwi44KS5o6i44GZCgkJcFN0ciA9IHN0cnN0cigmc3RyW3N0YXJ0XSwgIlwiLFwiIik7CgkJaWYgKHBTdHIgPT0gTlVMTCApIHsKCQkJLy8gIiwi44GM44Gq44GE5aC05ZCI44CB5pyA5b6M44GuIuOCkuaOouOBmQoJCQlwU3RyID0gc3Ryc3RyKCZzdHJbc3RhcnRdLCAiXCJcbiIpOwoJCX0KCQlzaXplID0gcFN0ciAtICZzdHJbc3RhcnRdOwoJCXN3aXRjaCAoaSkgewoJCWNhc2UgMDoKCQkJLy8g44Kk44Oz44OH44OD44Kv44K5CgkJCXN0cm5jcHkoYnVmZiwgJnN0cltzdGFydF0sIHNpemUpOwoJCQlwUi0+aWR4ID0gYXRvaShidWZmKTsKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQkvLyDjgr/jgqTjg4jjg6sKCQkJc3RybmNweShwUi0+dGl0bGUsICZzdHJbc3RhcnRdLCBzaXplKTsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQkvLyDml6Xku5gKCQkJc3RybmNweShwUi0+ZGF0ZSwgJnN0cltzdGFydF0sIHNpemUpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9CgkJc3RhcnQgPSBzdGFydCArIHNpemUgKyAzOwoJfQp9CgovLyBSZWNvcmTjga7jgr3jg7zjg4jjgpLooYzjgYTjgb7jgZkKLy8g5LuK5Zue44GvM+eVquebruOBrumgheebruOBqDHnlarnm67jga7poIXnm67jga7mmIfpoIbjgavjgZfjgb7jgZfjgZ/jgIIKc3RydWN0IFJlY29yZCoqIHNvcnQoc3RydWN0IFJlY29yZCogcFJlY29yZCwgc3RydWN0IFJlY29yZCoqIG91dCwgaW50IHNpemUpIHsKCWludCBpLCBqOwoJc3RydWN0IFJlY29yZCogcHRtcDsKCWludCBjbXA7CgoJLy8g5Ye65Yqb55So44Od44Kk44Oz44K/6YWN5YiX44GrUmVjb3Jk44Gu44Od44Kk44Oz44K/44KS44GZ44G544Gm6Kit5a6a44GZ44KLCglmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJb3V0W2ldID0gJnBSZWNvcmRbaV07Cgl9CgoJZm9yIChpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKCgkJZm9yIChqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKCQkJLy8g5paH5a2X5YiX5q+U6LyDCgkJCS8vIOODneOCpOODs+ODiO+8ku+8ju+8kiDmp4vpgKDkvZPjgavlhaXjgozjgZ/jga7jgaflpb3jgY3jgarpoIXnm67jgafjgr3jg7zjg4jjgafjgY3jgb7jgZkKCQkJY21wID0gc3RyY21wKG91dFtpXS0+ZGF0ZSwgb3V0W2pdLT5kYXRlKTsKCQkJaWYgKGNtcCA+IDAgfHwgKGNtcCA9PSAwICYmIG91dFtpXS0+aWR4ID4gb3V0W2pdLT5pZHgpKSB7CgkJCQkvLyDml6Xku5jjgYzjgIFvdXRbaV0gPiBvdXRbal3jga7loLTlkIjjgIHjgoLjgZfjgY/jga8KCQkJCS8vIOaXpeS7mOOBjOWQjOOBmOOBp+OAgeOCpOODs+ODh+ODg+OCr+OCueOBjG91dFtpXSA+IG91dFtqXeOBruWgtOWQiOODneOCpOODs+OCv+WFpeOCjOabv+OBiAoJCQkJcHRtcCA9IG91dFtpXTsKCQkJCW91dFtpXSA9IG91dFtqXTsKCQkJCW91dFtqXSA9IHB0bXA7CgkJCX0KCQl9Cgl9CglyZXR1cm4gb3V0Owp9CgovLyBDU1bjg5XjgqHjgqTjg6vlh7rlipsKdm9pZCBvdXRwdXQoRklMRSogZnAsIHN0cnVjdCBSZWNvcmQqKiBvdXQsIGludCBzaXplKSB7CglpbnQgaTsKCglwcmludGYoInNvcnTlvoxcbiIpOwoJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCS8vIOODneOCpOODs+ODiO+8kyDjgqvjg7Pjg57ljLrliIfjgorjga7mloflrZfliJfjgpLkvZzmiJDjgZfjgablh7rlipvjgZfjgb7jgZkKCQlmcHJpbnRmKGZwLCAiXCIlZFwiLFwiJXNcIixcIiVzXCJcbiIsIG91dFtpXS0+aWR4LCBvdXRbaV0tPnRpdGxlLAoJCQkJb3V0W2ldLT5kYXRlKTsKCQlwcmludGYoIlwiJWRcIixcIiVzXCIsXCIlc1wiXG4iLCBvdXRbaV0tPmlkeCwgb3V0W2ldLT50aXRsZSwKCQkJCW91dFtpXS0+ZGF0ZSk7Cgl9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKCWNoYXIgc3RyWzI1NV07CgkvLyDmp4vpgKDkvZPjga7phY3liJcKCXN0cnVjdCBSZWNvcmQgcmVjb3JkWzEwMF07CgkvLyDmp4vpgKDkvZPjga7jg53jgqTjg7Pjgr/jga7phY3liJfvvIjjgr3jg7zjg4jnlKjvvIkKCXN0cnVjdCBSZWNvcmQgKnNvcnRlZFsxMDBdOwoJaW50IGkgPSAwLCBzaXplOwoJLy8gZm9wZW4o44OV44Kh44Kk44Or5ZCNLCDjgqrjg5fjgrfjg6fjg7Mp44Gn44OV44Kh44Kk44Or44KS6ZaL44GN44G+44GZCglGSUxFKiBmcCA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CgkvLyDjg5XjgqHjgqTjg6vjgpLplovjgZHjgarjgYTloLTlkIjjgIFGSUxF44Gu44Od44Kk44Oz44K/44GMTlVMTOOBq+OBquOCiuOBvuOBmQoJaWYgKGZwID09IE5VTEwgKSB7CgkJcHV0cygi44OV44Kh44Kk44Or44GM6ZaL44GR44Gq44GE44KI77yBIik7CgkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCX0KCXByaW50Zigic29ydOWJjVxuIik7CgkvLyBmZ2V0cyjoqq3jgb/ovrzjgoDjg5Djg4Pjg5XjgqEsIOODkOODg+ODleOCoeOBruOCteOCpOOCuiwgRklMReOBruODneOCpOODs+OCvynjgafkuIDooYzjgZrjgaToqq3jgb/ovrzjgb/jgb7jgZkKCXdoaWxlIChmZ2V0cyhzdHIsIDI1NSwgZnApKSB7CgkJLy8g6Kqt44G/6L6844KT44Gg5YaF5a6544KS44Gd44Gu44G+44G+5Ye65YqbCgkJcHJpbnRmKHN0cik7CgkJLy8g44Od44Kk44Oz44OI77yRIOiqreOBv+i+vOOCk+OBoOODhuOCreOCueODiOOCkuOAgeWIhuino+OBl+OBpuani+mAoOS9k+OBrumFjeWIl+OBq+ioreWumuOBl+OBvuOBmeOAggoJCS8vIFJlY29yZOani+mAoOS9k+OBq+ODh+ODvOOCv+OCkuioreWumgoJCXNldFJlY29yZCgmcmVjb3JkW2ldLCBzdHIpOwoJCWkrKzsKCX0KCS8vIOWFpeWKm+ODleOCoeOCpOODq+OCkuOCr+ODreODvOOCugoJZmNsb3NlKGZwKTsKCS8vIOOCteOCpOOCuuOCkuS/neWtmAoJc2l6ZSA9IGk7CgoJLy8g44Od44Kk44Oz44OI77ySIOani+mAoOS9k+OBrumFjeWIl+OCkuOCveODvOODiOOBl+OBvuOBmQoJc29ydChyZWNvcmQsIHNvcnRlZCwgc2l6ZSk7CgoJLy8g5Ye65Yqb44OV44Kh44Kk44Or44KS6ZaL44GN44G+44GZCglmcCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CgkvLyDjg5XjgqHjgqTjg6vjgpLplovjgZHjgarjgYTloLTlkIjjgIFGSUxF44Gu44Od44Kk44Oz44K/44GMTlVMTOOBq+OBquOCiuOBvuOBmQoJaWYgKGZwID09IE5VTEwgKSB7CgkJcHV0cygi44OV44Kh44Kk44Or44GM6ZaL44GR44Gq44GE44KI77yBIik7CgkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCX0KCS8vIOWHuuWKm+ODleOCoeOCpOODq+OBq+abuOOBjei+vOOBv+OBvuOBmQoJb3V0cHV0KGZwLCBzb3J0ZWQsIHNpemUpOwoJLy8g5Ye65Yqb44OV44Kh44Kk44Or44KS44Kv44Ot44O844K6CglmY2xvc2UoZnApOwoKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K