#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BUFF_MAX 32768
#define FIELD_MAX 1024
int MakeCsvHead(char *, char *, int);
int MakeCsvData(char *, char *, int, int, int);
char fullpath1[2048];
char fullpath2[2048];
int main(int argc, char **argv)
{
int len;
int head_count;
int data_count;
int dc_flag;
int sp_flag;
int insert_flag;
struct stat st;
char work[1024];
dc_flag = 1;
sp_flag = 0;
insert_flag = 0;
if(argc <= 1 || argc >= 4) {
if(argc == 4 && strcmp(argv[3], "-insert") == 0) {
printf("-insert オプション検出! insert.sql を作成します\n");
insert_flag = 1;
} else {
printf("パラメータが不正です\n");
return -1;
}
}
strcpy(fullpath1, argv[1]);
if(stat(fullpath1, &st) != 0) {
printf("%s\n入力ファイルが存在しません\n", fullpath1);
return -1;
}
if(argc == 3) {
strcpy(fullpath2, argv[2]);
} else {
strcpy(fullpath2, fullpath1);
strcat(fullpath2, ".txt");
}
if(strcmp(fullpath1, fullpath2) == 0) {
printf("変換元/変換先ファイル名が同じ\n");
return -1;
}
printf("SELECT結果変換 - 開始\n");
head_count = MakeCsvHead(fullpath1, fullpath2, dc_flag);
data_count = MakeCsvData(fullpath1, fullpath2, dc_flag, sp_flag, insert_flag);
printf("SELECT結果変換 - 完了っ[%d件] [%d項目]\n", data_count, head_count);
}
int numeric_check(char *str)
{
int i;
int len;
int count;
len = 0;
count = 0;
if(str[0] != '-' && str[0] != '+') {
return -1;
}
len = strlen(str);
for(i=1; i < len ; i++) {
if(str[i] == 0x00) {
break;
}
if(str[i] < 0x30 || str[i] > 0x39) {
if(str[i] == '.') {
count ++;
} else {
return -1;
}
}
}
if(count != 1) {
return -1;
}
return 0;
}
int DeleteSpace(char *str1, char *str2, int size)
{
int i;
int len;
strcpy(str2, str1);
for(i=0; i<size; i++) {
if(str1[i] == 0x20) {
strcpy(str2, &str1[i+1]);
} else {
break;
}
}
len = strlen(str2);
for(i=len-1; i>0; i--) {
if(str2[i] == 0x20) {
str2[i] = 0x00;
} else {
break;
}
}
len = strlen(str2);
return len;
}
int CheckRecord(char *buff, char *tablename)
{
int i;
char *p;
if((p = strstr(buff, "xxxx.")) != NULL) {
for(i=0; ; i++) {
if(p[i] == ' ' || p[i] == 0x0a) {
memset(tablename, 0x00, sizeof(tablename));
memcpy(tablename, p, i);
break;
}
}
}
if(strncmp(buff, "Number of records", 17) == 0) {
return -1;
}
if(strncmp(buff, "SQLSTATE", 8) == 0) {
return -1;
}
if(strncmp(buff, "SQLMSG", 6) == 0) {
return -1;
}
if(strncmp(buff, "SELECT", 6) == 0) {
return -1;
}
if(strncmp(buff, "select", 6) == 0) {
return -1;
}
if(strncmp(buff, "Select", 6) == 0) {
return -1;
}
return 0;
}
int MakeCsvHead(char *in_file, char *out_file, int dc_flag)
{
FILE *fp1, *fp2;
int i;
int len;
int count_record;
int count_field;
char buff[BUFF_MAX];
char work[BUFF_MAX];
if(in_file == NULL || out_file == NULL) {
return(-1);
}
fp1 = fopen(in_file, "r");
if(fp1 == NULL) {
return(-1);
}
fp2 = fopen(out_file, "w");
if(fp2 == NULL) {
fclose(fp1);
return(-1);
}
count_record = 0;
count_field = 0;
while(1) {
if(count_field >= FIELD_MAX) {
break;
}
memset(buff, 0x00, sizeof(buff));
if(fgets(buff, BUFF_MAX-1, fp1) == NULL) {
break;
}
if(CheckRecord(buff, work) != 0) {
continue;
}
len = strlen(buff);
buff[len-1] = NULL;
if(strncmp(buff, "<<", 2) == 0) {
count_record ++;
if(count_record > 1) {
break;
}
continue;
}
for(i = 0; i<BUFF_MAX; i ++) {
if(buff[i] == ':') {
count_field ++;
if(count_field > 1) {
fprintf(fp2, ",");
}
buff[i]=0x00;
len = strlen(buff);
memset(work, 0x00, sizeof(work));
DeleteSpace(buff, work, len);
fprintf(fp2, "%s", work);
break;
}
}
}
fprintf(fp2, "\n");
fclose(fp1);
fclose(fp2);
return(count_field);
}
int MakeCsvData(char *in_file, char *out_file, int dc_flag, int sp_flag, int insert_flag)
{
FILE *fp1, *fp2;
FILE *fp3;
int i;
int len;
int count_record;
int count_field;
char buff[BUFF_MAX];
char work[BUFF_MAX];
char tname[BUFF_MAX];
if(in_file == NULL || out_file == NULL) {
return(-1);
}
fp1 = fopen(in_file, "r");
if(fp1 == NULL) {
return(-1);
}
fp2 = fopen(out_file, "a");
if(fp2 == NULL) {
fclose(fp1);
return(-1);
}
if(insert_flag == 1) {
fp3 = fopen("insert.sql", "w");
if(fp3 == NULL) {
fclose(fp1);
fclose(fp2);
return(-1);
}
}
count_record = 0;
count_field = 0;
while(1) {
if(count_field >= FIELD_MAX) {
break;
}
memset(buff, 0x00, sizeof(buff));
if(fgets(buff, BUFF_MAX-1, fp1) == NULL) {
break;
}
if(CheckRecord(buff, tname) != 0) {
continue;
}
len = strlen(buff);
buff[len-1] = NULL;
if(strncmp(buff, "<<", 2) == 0) {
count_record ++;
count_field = 0;
if(count_record > 1) {
fprintf(fp2, "\n");
}
if(insert_flag == 1) {
if(count_record >= 2) {
fprintf(fp3, ");\nCOMMIT WORK;\n");
fprintf(fp3, "INSERT INTO %s VALUES (", tname);
} else {
fprintf(fp3, "INSERT INTO %s VALUES (", tname);
}
}
continue;
}
for(i = 0; i<BUFF_MAX; i ++) {
if(buff[i] == ':') {
count_field ++;
if(count_field > 1) {
fprintf(fp2, ",");
if(insert_flag == 1) {
fprintf(fp3, ",");
}
}
if(sp_flag == 1) {
len = strlen(&buff[i+1]);
memset(work, 0x00, sizeof(work));
DeleteSpace(&buff[i+1], work, len);
} else {
strcpy(work, &buff[i+1]);
}
if(dc_flag == 1) {
if(numeric_check(work) != 0) {
fprintf(fp2, "\"%s\"", work);
if(insert_flag == 1) {
fprintf(fp3, "'%s'", work);
}
} else {
fprintf(fp2, "%s", work);
if(insert_flag == 1) {
fprintf(fp3, "%s", work);
}
}
} else {
fprintf(fp2, "%s", work);
if(insert_flag == 1) {
fprintf(fp3, "%s", work);
}
}
break;
}
}
}
fprintf(fp2, "\n");
if(insert_flag == 1) {
fprintf(fp3, ");\nCOMMIT WORK;\n");
}
fclose(fp1);
fclose(fp2);
if(insert_flag == 1) {
fclose(fp3);
}
return(count_record);
}