C言語でCSVファイルを読み込んで三次元配列に格納する方法を詳しく解説

C言語でcsvファイルを読み込んで三次元配列に格納する方法を解説します。

csvファイルはデータの保存や転送によく使われる形式ですが、そのままでは扱いづらいため、扱いやすいように配列に変換することも多いです。

本記事では、csvファイルの読み込み方から、三次元配列への格納方法まで詳しく解説していきます。

目次

C言語でcsvファイルを読み込む方法

CSVファイルは、カンマ区切りのテキストファイルです。C言語を使ってCSVファイルを読み込んで、データを三次元配列に格納する方法を解説します。

ファイルを開く

まず、fopen()関数を使用してCSVファイルを開きます。以下のように書きます。

FILE *fp;
fp = fopen("sample.csv", "r");

上記の例では、sample.csvという名前のCSVファイルを読み込んでいます。"r"は読み込みモードで開くことを示しています。もし書き込みモードで開きたい場合は、"w"と指定します。

読み書き両方行う場合はrwと書きます。

ファイルからデータを読み込む

CSVファイルからデータを読み込むには、fgets()関数またはfscanf()関数を使用することが多いですが、ここでは、fgets()関数を使用した例を示します。

fgets関数は1行ずつ読み込む関数です。

char line[1024];
while (fgets(line, 1024, fp)) {
    // 行ごとの処理
}

上記の例では、1行ずつCSVファイルからデータを読み取ります。1行分のデータは文字列として変数lineに格納されます。

データを三次元配列に格納する

CSVファイルから取得したデータは、三次元配列に格納することができます。以下のようなコードで実現できます。

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include<string.h>
#define MAX_ROWS 100
#define MAX_COLS 100
int main() {

    FILE* fp;
    fp = fopen("sample.csv", "r");

    char data[MAX_ROWS][MAX_COLS][100] = {0};
    int row = 0;

    char* token;
    char line[1024];
    while (fgets(line, 1024, fp)) {
        int col = 0;
        token = strtok(line, ",");
        while (token != NULL) {
            strcpy(data[row][col], token);
            col++;
            token = strtok(NULL, ",");
        }
        row++;
    }

    return 0;
}

上記の例では、最大100行×100列までのデータが扱えるように設定されています。各要素は文字列型(char型)です。

11~12行目では、2次元配列datarow変数(現在処理中の行番号)を初期化しています。

16行目以降では、1行分のデータ(文字列)が変数lineに格納されています。

18行目では、strtok()関数によってカンマ区切りごとにトークン化された文字列がtokenポインタ変数に順番に代入されていきます。

20行目では、strcpy()関数によってdata[row][col]要素(現在処理中のセル)にtokenポインタ変数が指す文字列がコピーされていきます。

21・24行目では、rowcol変数(現在処理中のセル位置)が更新されています。

この流れでCSVファイルを読み込んで配列に格納することができます。

三次元配列に格納したデータを使って処理をする方法

三次元配列に格納したデータを使って処理をする方法について解説します。

データの表示

三次元配列に格納されたデータを表示する方法は、forループを使用することです。以下は、三次元配列dataの要素を全て表示する例です。

int i, j;
for (i = 0; i < MAX_ROWS; i++) {
    for (j = 0; data[i][j][0] != '\0'; j++) {
        printf("%s ", data[i][j]);
    }
    if(j == 0) break;
    printf("\n");
}

格納可能な最大行数でループし、格納された文字列がなくなるまで文字列を取得しています。

データの加工

三次元配列に格納されたデータを加工する場合も、forループを使用します。以下は、三次元配列dataの各要素に#を付け足して表示する例です。

int i, j;
for (i = 0; i < MAX_ROWS; i++) {
    for (j = 0; data[i][j][0] != '\0'; j++) {
        strcat(data[i][j], "#");
        printf("%s ", data[i][j]);
    }

    if(j == 0) break;

    printf("\n");
}

この例では、各要素が十分な長さであることが前提条件です。また、文字列操作関数のstrcat()を使用しています。

データの保存

三次元配列に格納されたデータをファイルに保存する場合は、ファイル出力関数fwrite()fprintf()などを使用します。以下は、三次元配列dataの内容をCSV形式でファイルに保存する例です。

FILE *fp;
fp = fopen("output.csv", "w");
if (fp == NULL) {
    printf("ファイルが開けません\n");
    exit(1);
}

int i, j;
for (i = 0; i < MAX_ROWS; i++) {
    for (j = 0; data[i][j][0] != '\0'; j++) {
        fprintf(fp, "%s ", data[i][j]);
    }

    if(j == 0) break;
    fprintf(fp, "\n");
}

int i, j;
for (i = 0; i < ROWS; i++) {
    for (j = 0; j < COLS-1; j++) {
        fprintf(fp, "%s,", data[i][j]);
    }
    fprintf(fp, "%s\n", data[i][COLS-1]);
}

fclose(fp);

この例では、ファイルポインタ変数fpがCSV形式で書き込み可能な状態で開かれていることが前提条件です。また、各要素が文字列型であることも前提条件です。

終わりに

以上が、C言語でcsvファイルを読み込んで三次元配列に格納する方法の詳しい解説でした。

プログラミング初心者だとまだあまり扱ったことがない三次元配列が登場しましたが、実際にサンプルコードを動かしてみると少しずつ分かってくるはずです。

CSVファイルを扱う際には、エンコーディングや改行コード、データ形式などに注意しなければならないこともありますが、この記事を参考にしてスムーズに処理を行ってください。

目次