PythonでJSONファイルを読み込みCSVデータを作成するツールを作ってみた

## １．作成物 
・各試験を行う上でサンプルデータを作成するにあたって便利かなと思い、ランダムで文字列や数値をCSVファイルで出力するツールを作成した。

・作成するCSVの各列についてはJSONファイルで指定しておいて、コマンド側ではファイルの読込先、出力先、行数の指定のみにした。
（今回、プライベートでのGitHubへの展開やQiita投稿が初めてなのでかなり手探りで作成した）

## ２．簡単な仕様
・下記の機能をまずは実装した。
・後々、名前、住所等の様々なタイプについてランダムで作成できるようにする。

### ■ 機能
①JSONファイルから各CSV列の要素の読み込み
②読み込んだ要素に沿って文字列または数値のランダム値を作成
③指定した行数分、JSONから読み取った要素のランダム値をカンマ区切りで作成

### ■ 操作イメージ
・コマンドラインで下記を設定
　・読込先のJSONファイルパス
 　・作成先のCSVファイルパス
 　・作成の際の行数

### ■ JSONで指定する要素
　・値の種類（文字列:1、数値:2）
 　・文字列は桁数を指定（要素1）
  　・数値は開始値（要素1）と最終値（要素2）を指定

## ３．用意したJSONファイル
↓作成物
>https://github.com/k-tsuru/tool/commit/038a960ed0053373d00014cef93e62b762d7d30d

・上記の「JSONで指定する要素」を基に下記の構成でファイルを用意
```JSON:read_sample.json
  {
    "column1":{
        "type":"1",
        "element1": 10,
        "element2": 1
    },

    "column2":{
        "type":"2",
        "element1": 1000,
        "element2": 3000
    },

    "column3":{
        "type":"2",
        "element1": -100000,
        "element2": 100000
    }
}
```
:::note info
・"column"は列（追加する分、列が増える）
・"type"は"1":文字列,"2":数値
・"type"が文字列(1)の場合、"element1"は桁数　※"element2"は無視
・"type"がの数値(2)の場合、"element1"は開始値と"element2"は終了値
:::
## ４．実装したPythonファイル
↓作成物
>https://github.com/k-tsuru/tool/commit/1e3992eae4a2911fa77ea72a5ffe1b1079bfcc71

### 1.import
```Python:create_csv_json.py
import os
import json
import random
import random, string
```
:::note info
今回はJSONファイルの読み込みやランダム関数を使用する為、上のimportを記載
:::

### 2.コマンドラインでの読込ファイルの指定
```Python:create_csv_json.py
print('===読込先の情報入力===')
input_dir_path = input('読込先のパスを入力してください。>>')
input_file_name = input('読込先のファイル名を入力してください。>>')

read_json_file = os.path.join(input_dir_path, input_file_name)
```
:::note info
コマンドラインで読込先のファイルパスを取得
:::
### 3.コマンドラインでの作成ファイルの指定
```Python:create_csv_json.py
print('===出力先の情報入力===')
output_dir_path = input('保存先のパスを入力してください。>>')
output_file_name = input('保存するファイル名を入力してください。>>')
row_no = int(input('入力する行数を指定してください>>'))

new_file_path = os.path.join(output_dir_path, output_file_name)
```
:::note info
コマンドラインで作成先のファイルパス、作成行数を指定
:::
### 4.ランダム文字列の生成
```Python:create_csv_json.py
# ランダムで文字列入力
def randomname(n):
   return ''.join(random.choices(string.ascii_letters + string.digits, k=n))
```
:::note info
"n"で桁数を指定
:::
### 5.ランダム数値の生成
```Python:create_csv_json.py
# ランダムで数字入力
def randomvalue(start_no,end_no):
    random_value = random.randrange(start_no,end_no)
    return random_value
```
:::note info
"start_no","end_no"で開始値、最終値を指定
:::
### 6.ランダム数値の生成
```Python:create_csv_json.py
# CSVファイル作成行数の初期化
count = 0

# CSVファイル作成
f = open(new_file_path, mode='w')
while count < row_no:
    column_length = 0
    str_row = ''
    for json_value in json_load.values():
        if json_value['type'] == '1':
            str_row += randomname(json_value['element1'])
            str_row += ','
        elif json_value['type'] == '2':
            str_row += str(randomvalue(json_value['element1'],json_value['element2']))
            str_row += ','
    # 末尾1文字を削除
    f.write(str_row[:-1])
    f.write('\n')
    count += 1
f.close()
```
:::note info
JSONファイルを読み込んだ列数分、for文で処理を行う。
種類（type）が文字列の場合はランダム文字列関数の呼び出し
種類（type）が数値の場合はランダム数値関数を呼び出す
各行の最後に不要な","がつくため1行作成の終わりにstr_row[:-1]で最後の1文字目を削除し、改行コードを付与
:::
## ５．今後のアップデート
・まずはJSONファイルを読み込みそれを基にランダムでCSVファイルを作成することを目指した。
・今後は名前や住所のサンプルデータを作成するために種類（type）を追加で実装することを進めていく。