どーも!
たかぽんです!
今回、お仕事をしていて、簡単なテスト用のcsvをサクッと作りたいな...となったのですが...
awkを使って大規模なcsvを作成することができそうだったため、実際に試してみました!
awkとは?
awkは、Linuxでデフォルトで使用することができる、プログラミング言語のひとつで、主にテキストを扱うことができます。
普段はCLIでコマンドとして用いることが主なんですが、プログラミング言語のため、プログラムとして記述して実行することも可能です。
今回はそのプログラムを書いて、csvを作っていきます。
大まかなawkの概要は以下の記事にてまとめているので、是非参照してみてください!
csvを作ってみる!
では、早速ですが....!
今回はとても単純にidのカラムだけ持つcsvで、100万件のデータがあるcsvを作ってみます。
BEGIN {
srand();
printf("id\n");
for (i = 1; i <= 1000000; i++) {
new_id = generate_unique_id();
printf("%d\n", new_id);
}
}
function generate_unique_id() {
id = int(rand() * 1000000) + 1;
while (id in generated_ids) {
id = int(rand() * 1000000) + 1;
}
generated_ids[id] = 1;
return id;
}
上記はBeginで一回だけ処理を行なわれますが、printfでヘッダ'(id)を出力し、その後forでn件のユニークなidを描画する...といった形です。
generate_unique_idの詳細はあまり本質ではないので省略しますが、生成したランダム数が生成済みのものと比較して一致しないようにしています。
出力されたtest.csvは以下の通りです。
確かに1000000行あり、データもidらしきものが入っていることが確認できました。
taka@Taka Downloads % wc -l test.csv
1000001 test.csv
taka@Taka Downloads % head -n 5 test.csv
id
382045
416380
160992
267047
値を追加する場合はprintfに","区切りでヘッダーを追加することで実現できます。
例えば文字列でUserNameというヘッダーを追加し、さらにランダムな10m文字のテキストをカラムとして持たせる場合は以下のような形です。
BEGIN {
srand();
printf("id,UserName\n");
for (i = 1; i <= 1000000; i++) {
new_id = generate_unique_id();
new_user_name = generate_random_string(10);
printf("%d,%s\n", new_id, new_user_name);
}
}
function generate_unique_id() {
id = int(rand() * 1000000) + 1;
while (id in generated_ids) {
id = int(rand() * 1000000) + 1;
}
generated_ids[id] = 1;
return id;
}
function generate_random_string(str_length) {
str = "";
characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (j = 1; j <= str_length; j++) {
rand_index = int(rand() * length(characters)) + 1;
str = str substr(characters, rand_index, 1);
}
return str;
}
あくまでテストデータなので、絶対そんな名前ないやろ!的な文字列ではありますが...
以下のようにちゃんとCSV形式で書き出されていることが確認できます。
taka@Taka Downloads % awk -f test.awk > test.csv
taka@Taka Downloads % head -n 5 test.csv
id,UserName
723685,cpqr2QozCC
867288,EkBpkR8hUj
760818,VhxVJivP0x
930787,hPXX3mqveV
今回は先日学んだawkを使ってcsvを作ってみました!
テキストを扱うのが強いだけあって、とても楽にテストデータを生成することができそうです!
より人らしいテキストや、電話番号など、もうちょっとそこら辺は改良の余地がありそうですが、ある程度あり得そうな値ごとに関数を用意しておけば今後どんなパターンが来てもサッと作れるもしれないですね...!
時間があればもう少し深掘りしてみようかなと!
それでわ!