ランダムデータの合成(CSV ファイルの生成,SQLite 3 データベースの生成)

概要

このページでは,CSV ファイル形式のランダムデータを生成するプログラムと,その実行手順を説明する.さらに,生成した CSV ファイルから SQLite 3 のデータベースを作成する.

目次

第1章 前準備

curl のインストール(Ubuntu 上)

次のコマンドを実行する(curl はファイルをダウンロードするためのコマンドラインツール)。

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install curl

第2章 ランダムデータの入った CSV ファイルの生成(Ubuntu 上)

◆ 生成するデータファイル

◆ ソースコードのダウンロードとコンパイル手順(gcc は C 言語のコンパイラ)

cd /tmp
rm -f populate.c
curl -O https://www.kkaneko.jp/ai/bigdata/populate.c
gcc -o a.out populate.c

◆ 実行手順と実行結果の例(引数は生成する行数の上限を表す)

./a.out 10

プログラムのソースコード

#include<stdio.h>
#include<time.h>
#include<sys/time.h>
#include<stdlib.h>

int main(int argc, char** argv)
{
  struct timeval tv;
  struct tm *pnow = NULL;
  int i;
  srand((unsigned)time(NULL));

  /* header */
  printf( "seq, name, a1, a2, created_at, updated_at \n" );

  for( i = 1; i < atoi(argv[1]); i++ ) {

    gettimeofday(&tv, NULL);
    pnow = localtime(&tv.tv_sec);

    int yy = pnow->tm_year+1900;
    int mm = (12.0 * ((int)rand())/RAND_MAX)+1;
    int dd = (30.0 * ((int)rand())/RAND_MAX)+1;

    int h = pnow->tm_hour;
    int m = pnow->tm_min;
    int s = pnow->tm_sec;
    int msec = tv.tv_usec;

    /* seq, NAME */
    printf( "%12.12d, A001, ", i );

    /* A1, A2 */
    printf( "%f, %f, ",     100.0 * ((double)rand())/RAND_MAX,     100.0 * ((double)rand())/RAND_MAX );

    /* created_at */
    printf( "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%6.6d, ", yy, mm, dd, h, m, s, msec );
    /* updated_at */
    printf( "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%6.6d\n", yy, mm, dd, h, m, s, msec );
  }

  return 0;
}

第3章 SQLite 3 データベースの生成(Ubuntu 上)

SQLite 3 のインストール

SQLite 3は,リレーショナルデータベース管理システム

あらかじめ決めておく事項

このページでは,SQLite 3 データベースの生成を行う。 生成するSQLite 3 データベースのデータベース名を決めておくこと。

生成する SQLite 3 データベース名: /tmp/random.db

データベース名は自由に決めてよいが,半角文字(英字と英記号)を使い,スペースを含めないこと。

SQLite 3 データベースの生成

テーブル定義

random(seq, name, a1, a2, created_at, updated_at)

  1. csvkit, nkf のインストール(csvkit は CSV を操作するツール群,nkf は文字コードを変換するツール)
    sudo apt -y install csvkit nkf
    
  2. CSV ファイルの生成
    • 生成する CSV ファイル名: /tmp/random.csv
    • その本体の行数: 100000
    cd /tmp
    rm -f populate.c
    curl -O https://www.kkaneko.jp/ai/bigdata/populate.c
    gcc -o a.out populate.c
    ./a.out 100000 > /tmp/random.csv
    head /tmp/random.csv
    
  3. CSV ファイルから SQLite 3 データベースの生成
    • 処理する CSV ファイル名: /tmp/random.csv
    • 生成する SQLite 3 データベース名: /tmp/random.db

    csvsql は,CSV ファイルからテーブルを作成しデータを挿入する(テーブル名は拡張子を除いたファイル名となるため,ここでは random になる)。

    rm -f /tmp/random.db
    csvsql --db sqlite:////tmp/random.db --insert /tmp/random.csv
    echo "vacuum;" | sqlite3 /tmp/random.db
    echo "select * from random limit 20;" | sqlite3 /tmp/random.db