実現したいこと
「連番データの入ったCSVファイルの値でHTTPのPOSTリクエストをデータ数分(1000件ほど)実行したい」
ポイントは以下の二つ
- CSVファイルからfor(loop)文で1件ずつデータを取り出す
- 取り出した値をリクエストボディに埋め込んでcurlリクエストを投げる
ループ文の書き方とCSVファイルの読み込み方
使用するCSVデータファイル
id,name,age
1,yamada_taro,15
2,yamada_hanako,14
3,suzuki_ichiro,20
・・・以下1000行
読み込み処理の記述
while read文でテキストファイルの文字列を一行ずつ取得することができる。
【参考】
https://qiita.com/SoarTec-lab/items/4475ba6de612fba3f163
#!/bin/bash
CSVDATA=data.csv
while read LINE || [ -n "${LINE}" ];
do
id=$(echo $LINE | cut -d, -f 1)
name=$(echo $LINE | cut -d, -f 2)
age=$(echo $LINE | cut -d, -f 3)
echo "id: $id, name: $name, age: $age"
done < $CSVDATA
while read LINE || [ -n "${LINE}" ];
単純にwhile read LINE do とするCSVファイルの最終行が実行されない事がある。
原因はデータファイルの最終行で行で改行していない事。
|| [ -n "${LINE}" ]とすることで最終行が改行文字でない場合も空行でなければ処理する、というような動作をさせることができる
CSVから一行ずつ取り出した後はcut文を使い
id=$(echo $LINE | cut -d, -f 1)
とする事で任意の位置の文字列を変数に格納できる。
(ここでは変数idに1列目左端の文字列を格納している)
curlリクエストの実行
loop処理で1列目のデータを取得できれば後はそのままcurlを実行すれば良い
#!/usr/bin/bash
CSVDATA=data.csv
ReadCount=1
HOST_URL="http://sample.com"
URL=samplePost
while read LINE || [ -n "${LINE}" ];
do
id=$(echo $LINE | cut -d, -f 1)
name=$(echo $LINE | cut -d, -f 2)
age=$(echo $LINE | cut -d, -f 3)
if [ $ReadCount != 1 ]; then
curl -L-X POST ${HOST_URL}/${URL} -H "id: ${Id}" -d @- << EOS
{
"name":${name},
"age":${age}
}
EOS
else
fi
let ReadCount++
done < $CSVDATA
ReadCountを用意することでCSV一行目のヘッダー行を取り出さないようにしている。
(if文でReadCount = 1の時に処理をスキップ)
-dの部分がリクエストのボディにあたる。
@- << EOSで標準入力を埋め込み、Json型リクエストボディの中で変数を扱えるようにしている。
これでCSVファイルを読み込みながらcurlリクエストが自動で実行されるスクリプトの完成です。
実行する前に!
スクリプトを組んでループ文で1000件POSTリクエストを送るのは慎重に行いましょう(自戒)。無限ループなど起きていたら発狂ものものです。
必ず実行する前に実行環境で処理中断のコマンドを調べてから実行することをおすすめします。
GitBashならCtrl + C!