[1.1] 私は今、金融商品の取引データを分析したくてプログラムを書いています
[1.2] それぞれの銘柄のコード(会社の番号)のフォルダに入っている日付のついたcsvファイルを読み込んで、処理を行っています。
ファイルは銘柄コードのフォルダ内に20120104.csv,20120105.csv…という風にあります。
現在下記に示した、コードのようにcsvファイルの内容を読み込んである特定の行の時、その行の特定の列の数字を合計して1日の集計結果として出力し、それを1年分行っています。
これを複数の銘柄にわたって行っています。
今困っているのは、現在のコードだと出力ファイルが1つになってしまうことです。
希望は銘柄コード+文字列.csv(例えば、銘柄コードが6501だとすると、6501_market.csv)のように出力ファイルを銘柄ごとに分けたいのです。
もう一つは、現在のコードだとかなり処理に時間がかかっているので何か効率化する方法はないのでしょうか?
(読み込むcsvファイルは104列、行は銘柄やその日によってまちまちですが最大で60万行くらいかと思います)
[2] 環境
[2.1] OS : Windows,
[2.2] コンパイラ名 : Visual C++ 2010
[3] その他
C言語は先輩のコードを必要なところを直す程度しかやったことはありません。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>
#include <math.h>
#define CSV_MAX 600000
#define MEIGARA_MAX 320
#define START_YEAR 2012
#define STOP_YEAR 2012
#define MA_RANGE 10
#define SMOOTH 0.1
#define START 50
#define DD 300
typedef struct{
int time;int zss;double dpp;int gbp[8], gap[8];
long int gbv[9],gav[9],blmt[9],almt[9], xv;
double pmin_dpp;double pmax_dpp;double dpmin_dpp; double dpmax_dpp;long int pxv[100][2];long int dpxv[100][2];
long int bmkt;
long int amkt;
int b_movement;
int a_movement;
long int bbook[8];
long int abook[8];
int period;
long double blmt_prob[8];
long double almt_prob[8];
int hh;int mm;
int yakujou;
int timesec;
int es;
int blmt_canc[9];int almt_canc[9];
int cpb;
int cpa;
int exc;
int esr;
int bclmt[9],aclmt[9];
long int mkt_i;
long int mkt_m;
long int allgbv, allgav;
long int allblmt, allalmt;
long int allbclmt, allaclmt;
}table;
table t[CSV_MAX];
int main() {
//struct table t[CSV_MAX];
FILE *fp;
FILE *output;
output = fopen("result.csv", "w");
fclose(output);
long int i;
int c, n, f_num, m, d, mn, row, flag, k, j, flag_gap, flag_gbp,hiduke,z,z2;
int ban;
char f_fullname_new[64]="new/";
//2013用
int syou;
int ctp;
int ccc;
int h, jj, kk,qq,jjj,kkk;
char temp[100];
long int itayose_time;
long int oohike_time;
int basyo;
int day;
int y,buyy,selly;
long int y_ryou,buy_y_ryou,sell_y_ryou,itayose_y_ryou;
long int Lkk00,Lkk01,Lkk02;
char f_name[MEIGARA_MAX][64] = {"","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""};
int amari,counthh,countmm;/*時刻読み込み用*/
c = 0; i = 0; // ban = 0; counthh = 0; countmm = 0; amari=0;
f_num=0;
if ((fp = fopen("list03.csv", "r")) == NULL) {
printf("list file can't open!!\n");
exit(EXIT_FAILURE);
}
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
i=0;
f_num++;
continue;
}
f_name[f_num][i++] = c;
}
fclose(fp);
for (mn=0; mn<f_num; mn++) {
hiduke = 0;//ban = 0;
/*銘柄ごとパラメータ初期化用------------------------------------------------------------------*/
day =0;
for (y=START_YEAR; y<=STOP_YEAR; y++){
for (m=1; m<=12; m++){
for (d=1; d<=31; d++){
sprintf(temp, "%s%s%s%d%d%d%d%d%s","D:\\tick2012\\data\\" , f_name[mn] ,"\\",y, m/10, m%10, d/10, d%10, ".csv");
printf("%s\n",temp);
//getchar();
if ( (fp = fopen(temp, "r")) == NULL ) {
continue;
}
day = day+1;
/*日ごと変数初期化 ------------------------------------------------------------------------------------------------------------------*/
for (i = 50; i < CSV_MAX; i++) {
t[i].time = 0; t[i].zss = 0; t[i].dpp = 0; t[i].xv = 0;
t[i].bmkt = 0; t[i].amkt = 0;t[i].period = 0;
t[i].hh = 0;t[i].mm = 0;
t[i].b_movement = 0;t[i].a_movement = 0;
t[i].yakujou = 0;
t[i].mkt_m = 0; t[i].mkt_i = 0;
t[i].timesec = 0;
for (j = 0; j < 8; j++) {
t[i].gbp[j] = 0;t[i].gap[j] = 0;
t[i].bbook[j] = 0;t[i].abook[j] = 0;
t[i].bclmt[j] = 0; t[i].aclmt[j] =0;
for(k=0;k<100;k++){
t[i].pxv[k][j]=0; t[i].dpxv[k][j]=0;
}
}
//デプスはoverの分も表示されるようになったため
for(j =0; j < 9; j++){
t[i].gbv[j] =0; t[i].gav[j]=0;
t[i].blmt[j] =0; t[i].almt[j]=0;
t[i].bclmt[j] = 0; t[i].aclmt[j] =0;
}
t[i].es=0;
t[i].cpa=0;t[i].cpb=0;
t[i].esr=0;
t[i].allgbv=0; t[i].allgav=0;
t[i].allblmt=0; t[i].allalmt=0;
t[i].allbclmt=0; t[i].allaclmt=0;
}
y = buyy = selly =0;
y_ryou = buy_y_ryou = sell_y_ryou = itayose_y_ryou =0;
Lkk00=Lkk01=Lkk02=0;
/* to table from file ------------------------------------------------------------------------------------------------------------------*/
//それぞれの値を決定する
i = 0;
n = 0;
while ((c = getc(fp)) != EOF) {
if (c == ',') { /* Kugiri */
n=n+1; //date の何列目かをカウントする変数
if(n == 10){//秒が読み終えたときに秒を時分に結合する
t[i].time=t[i].time*100;
t[i].time=t[i].time+t[i].timesec;
}
if(n ==4 ){
if(t[i].exc==21){
break;
}
}
}
else if (c == '\n'){n = 0;i++;} //1行分読み込んだら初期化
else {
switch (n) {
case 7:
t[i].time = t[i].time * 10 + (c - '0'); break;
case 9:
t[i].timesec = t[i].timesec*10+(c-'0'); break;
case 0:
t[i].yakujou = t[i].yakujou * 10 +(c-'0'); break;
case 11:
t[i].dpp = t[i].dpp * 10 + (c - '0'); break;
case 12:
t[i].xv = t[i].xv*10 + (c - '0'); break;
case 13:
t[i].es = t[i].es * 10 + (c - '0'); break;
case 3:
t[i].exc = t[i].exc * 10 + (c - '0'); break;
case 14:
t[i].esr = t[i].esr * 10 + (c - '0'); break;
default :
if (n >= 16 && n <= 23) {t[i].gap[n%16] = t[i].gap[n%16]*10 + (c - '0');}
else if (n >= 27 && n <= 34) {t[i].gbp[n%27] = t[i].gbp[n%27]*10 + (c - '0');}
else if (n >= 38 && n <= 46) {t[i].gav[n%38] = t[i].gav[n%38]*10 + (c - '0');}
else if (n >= 49 && n <= 57) {t[i].gbv[n%49] = t[i].gbv[n%49]*10 + (c - '0');}
break;
}
}
}
fclose(fp);
row = i; /*i=CSV_MAX*/
// ------------------------------------------------------------------------------------------------------------------
for(i = 0; i<1;i++){
basyo=t[i].exc;
}
for(i = 0; i< row; i++ ) {
if ( t[i].yakujou ==1){
if(t[i].es == 16){
t[i].amkt = t[i].xv;
}else if(t[i].es == 48){
t[i].bmkt = t[i].xv;
}else if(t[i].es == 1){
t[i].mkt_i=t[i].xv;
if(t[i].time<=113000){
itayose_time=i;
}
}else{
t[i].mkt_m=t[i].xv;
}
if(t[i].esr >= 0){
if(t[i].time==150000){
oohike_time=i+2;
}
}
}
}
//-------------------------------------------------------------------------------
for ( i = 0 ; i < oohike_time ; i++){
//回数と量を合計
if(t[i].yakujou == 1){
y +=1;
Lkk00=y_ryou;
y_ryou=Lkk00+t[i].xv;
if(t[i].es==16){
selly +=1;
Lkk01=sell_y_ryou;
sell_y_ryou=Lkk01+t[i].xv;
}
else if(t[i].es == 48){
buyy +=1;
Lkk02=buy_y_ryou;
buy_y_ryou=Lkk02+t[i].xv;}
else if(t[i].es == 1){
itayose_y_ryou += t[i].xv;}
Lkk00=Lkk01=Lkk02=0;
}
}
/*-------------------------------------------------------------------*/
sprintf(f_fullname_new, "%s%s", "new/", "market_canc.csv"); //ファイルへ出力
output = fopen(f_fullname_new,"a");
if (output == NULL)
{
printf ("Error opening file");
getchar();
exit (1);
}
else
{ fprintf(output, "%s,%d%d%d%d%d,%d,%d,%d,%Ld,%Ld,%Ld,%Ld\n"
,
f_name[mn],y, m/10, m%10, d/10, d%10,y,selly,buyy,y_ryou,sell_y_ryou,buy_y_ryou,itayose_y_ryou
);
}
fclose (output);
}//日ごと
}//月ごと
}//年ごと
}
}//main