クリエイター手抜きプロジェクト[635]シェル・コマンド編 MacのシェルでダミーのCSVデータを作成する
── 古籏一浩 ──

投稿:  著者:



今回は、Macのシェル(bash, zsh)でダミーのCSVデータを作成してみます。生成するのは数値のCSVデータです。文字列もできなくはありませんが、表組みなどでとりあえず縦横指定された数のCSVデータを、ダミーで用意する場合に便利かもしれません。

なお、今回はseqコマンドを使っています。このseqコマンドは古いMacでは実装されておらず使えません。が、似たような処理を行うjotコマンドがあります。完全な代替にはなりませんが、ほぼ同様に使う事ができます。

まず簡単なところで、1から10までの数値データを生成してみましょう。





その前に、以下のように入力して、デスクトップにカレントディレクトリを移動します。これは、ファイルが生成されれば、デスクトップ上に反映されるので見た目に分かりやすいから、という理由です。本当は生成したいフォルダ(ディレクトリ)に移動してから、各種コマンドを実行するのが吉です。

cd ~/Desktop/

ターミナルで、以下のように入力すると1から10までの数値が表示されます。

seq 10

1
2
3
4
5
6
7
8
9
10

このデータをnumber.txt(number.csvでもよい)として保存するには、以下のようにコマンドを入力します。

seq 10 > number.txt

数値範囲を指定してデータを生成することもできます。-100から100までの数値データを生成する場合は、以下のようにコマンドを入力します。

seq -100 100 > number.txt

数値を1ずつでなく5つずつ増やす場合は、以下のようにコマンドを入力します。

seq -100 5 100 > number.txt

小数値も指定できます。以下のようにすると、1から10まで0.1ずつ増えていく数値が生成されます。

seq 1 0.1 10 > number.txt

ただ、これだと1や2が1.0や2.0のようになりません。1.0のようにしたいなら、以下のようにコマンドを入力します。

seq -f'%.1f' 1 0.1 10 > number.txt

桁数を揃えたい場合は、以下のように-wを付けます。

seq -w 1 100 > number.txt

ここまでは、1行につき1データしかありません。そろそろCSVデータのように、コンマ(,)で区切って生成してみましょう。以下のように、-s,とすると,で区切られた1行のデータが生成されます。以下の場合は-wもつけてあるので、桁数を揃えたデータになります。

seq -w -s, 1 100 > number.txt

なお、コンマでなく空白区切りにしたい場合は、以下のように入力します。"-"ならハイフン区切りに、"#"なら#区切りになります。というか、好きな文字を入れることができるので、生成するデータに合わせればよいでしょう。

seq -w -s" " 1 100 > number.txt

それでは横5個、縦10個の数値データを生成してみましょう。テキストエディタで、以下のように入力します。ファイル名をseq1.shのようにして保存します。その際、改行コードはLFにして保存してください。

for i in `seq 10`
do
for j in `seq 5`
do
echo -n "$i$j,"
done
echo
done

ファイルを保存したら以下のようにコマンドを入力します。

chmod 755 seq1.sh

seq1.shが生成したファイルの名前(ファイルパス)になります。デスクトップ上に保存していない場合は、保存したフォルダの場所とファイル名を指定してください。用意できたら以下のように入力します。

seq1.sh > number.txt

すると、以下のような数値が生成されnumber.txtファイルに保存されます。

11,12,13,14,15,
21,22,23,24,25,
31,32,33,34,35,
41,42,43,44,45,
51,52,53,54,55,
61,62,63,64,65,
71,72,73,74,75,
81,82,83,84,85,
91,92,93,94,95,
101,102,103,104,105,

「そうでなくて1から順番に値を生成して欲しい」という人もいるかもしれません。この場合は、以下のようにすると、1〜55までの数値が生成されます。10や5の値を変えると、好きな数だけ生成できます。

for i in `seq 0 10`
do
for j in `seq 5`
do
echo -n `expr $i \* 5 + $j`","
done
echo
done

「ダミーデータなんだから乱数で構わない」という人もいるかもしれません。この場合は、以下のようにすると、0〜32767までの整数のランダムな値が生成されます。

for i in `seq 10`
do
for j in `seq 5`
do
echo -n "$RANDOM,"
done
echo
done

「乱数でいいけど0〜99までの範囲にしたい」という人もいるかもしれません。この場合は、以下のようにすると、0〜99までの乱数値になります。

for i in `seq 10`
do
for j in `seq 5`
do
echo -n $((RANDOM % 100)),
done
echo
done


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/


せっかくなので、100万個のCSVデータを生成させてみました。2.2GHz 6Core & HDDで約30秒ほどでした。古いマシンなので、最新マシンでSSDならあっという間に生成されそうです。

・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram


・8K/4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/


・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/