[C言語]CSVから郵便番号読み取り

– ユーザが郵便番号7桁を入力すると市区町村を返したい
– 郵便番号のデータは郵便局のHPで配布している
zipcode
– 全国一括データは12万件ある
-> 今回は東京都のデータを使用する
– データの中身を見ると、C列が郵便番号、G列が東京都、H列が区/市、I列が町村となっている。

まずExcelのデータ読み取りからか? ubuntuに”13TOKYO.CSV”を配置する。

#include <stdio.h>
#include <string.h> // strtokに必要
#include <stdlib.h>
#define MAX 2048

int main(void){
	FILE *fp;
	char buf[2048] = {0};
	char *ary[3];
	char fname[] = "13TOKYO.CSV";
	int i;
	
	if((fp=fopen(fname,"r"))!=NULL){
		i = 0;
		while(fgets(buf, 2048, fp) != NULL){
			ary[0] = strtok(buf,",");  // ','を区切りに分解する
			ary[1] = strtok(NULL,",");
			ary[2] = strtok(NULL,",");
			printf("%s %s %s\n", ary[0],ary[1],ary[2]);
			i++;
			if(i > 5){
				break;
			}
		}
	}
	fclose(fp);

	return 0;
}

$ ./main
1000000 ?????s ???c??
1020072 ?????s ???c??
1020082 ?????s ???c??
1010032 ?????s ???c??
1010047 ?????s ???c??
1000011 ?????s ???c??

文字化けする
gccを変えてみたがダメ
$ gcc -o main main.c -finput-charset=UTF-8 -fexec-charset=CP932

csvをUTF-8の文字コードで保存してみる。

$ ./main
1000000 東京都 千代田区
1020072 東京都 千代田区
1020082 東京都 千代田区
1010032 東京都 千代田区
1010047 東京都 千代田区
1000011 東京都 千代田区

来た!
CSVはstrtokでカンマ区切りで取得すればOKとのことです。