ページ 11

csvファイルの読み込みについて

Posted: 2015年7月21日(火) 23:46
by aridai
以下のcsvファイルがあったとします。

・1桁、もしくは2桁の整数が並んでいる
・コンマでそれぞれの値は区切られている
・横方向に200個の値、縦方向に15個の値をもつ

このファイルを

コード:

#define WIDTH 200
#define HEIGHT 15
int num[HEIGHT][WIDTH];
という
int型の2次元配列に格納していくにはどうすればいいでしょうか。

(Windows8.1 VS2013 C)

Re: csvファイルの読み込みについて

Posted: 2015年7月22日(水) 00:20
by Tatu
配列を用意。
行と列を示す変数を用意。
ファイルを開く。
一文字ずつ読み込む。
数字だったら配列の対応する要素を10倍し、読み込んだ数字を足す。
例:124という数値があったら
1文字目で1
2文字目で1*10+2=12
3文字目で12*10+4=124
となる。
コンマだったら一つ右にずれる。
改行だったら一つ下の一番左にずれる。
ファイル終端(EOF)が来たら読み込み終了。

というようにしてみてはどうでしょうか。

Re: csvファイルの読み込みについて

Posted: 2015年7月22日(水) 00:26
by box

コード:

1,23,-4,56
78,-9,12,3
-45,6,7,89
というファイル(名前は"test.csv")を読んでその内容を出力するサンプルコードです。
行・列を適当に拡張したりファイル名を適切に変更したりしてください。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WIDTH  (4)
#define HEIGHT (3)
#define LENGTH (500)        // 適切に決める

void openFile(FILE **fp)
{
    *fp = fopen("test.csv", "r");
    if (*fp == NULL) {
        puts("file open error");
        exit(1);
    }
}

void readFile(FILE *fp, int (*num)[WIDTH])
{
    char s[LENGTH], *dlm = ",", *p, *q;
    int i, j;

    for (i = 0; i < HEIGHT; i++) {
        fgets(s, LENGTH, fp);
        for (j = 0, q = s; j < WIDTH; q = NULL, j++) {
            p = strtok(q, dlm);
            num[i][j] = strtol(p, NULL, 10);
        }
    }
}

void printData(int (*num)[WIDTH])
{
    int i, j;

    for (i = 0; i < HEIGHT; i++) {
        for (j = 0; j < WIDTH; j++) {
            printf("%d%s", num[i][j], (j == WIDTH - 1) ? "" : ",");
        }
        putchar('\n');
    }
}

void closeFile(FILE *fp)
{
    fclose(fp);
}

int main(void)
{
    int num[HEIGHT][WIDTH];
    FILE *fp;

    openFile(&fp);
    readFile(fp, num);
    printData(num);
    closeFile(fp);
    return 0;
}

Re: csvファイルの読み込みについて

Posted: 2015年7月22日(水) 08:28
by aridai
わざわざソースまで貼っていただきありがとうございました。
無事に出来ました。