CSVのヘッダー行を飛ばしたい…
ひよっこエンジニアの個人的な覚書です。
CSVからデータを読み込んで処理するスクリプトを作成したかったのですが、
bash(というかスクリプト)初心者は、一行目のヘッダの部分を飛ばすにはどうしたらいいのかとてもとても悩みました。
あんまりお手本の記事が見つからなかったんですよね。きっと探し方が悪かっただけ。
手順
ReadCount=1
を変数指定
if文を使用し、ReadCountが1以外の場合のみ処理するように記述
let ReadCount++で変数ReadCountをインクリメント(1増やす)
CSVのデータの行数分これの繰り返し(while文)
具体例
読み込むCSVの内容(test.csv)
タイムスタンプ,名前,メールアドレス
2022/07/20 11:15:31,Tom Brown,test1@test.com
2022/08/01 09:00:01,Kate Spade,test2@test.com
SAMPLE CODE(csv_test.sh)
#!/bin/bash
ReadCount=1
while read row || [ -n "${row}" ];do
if [ $ReadCount != 1 ];then
TIMESTAMP=$(echo $row | cut -d "," -f 1) #CSVの1列目から日付データ取得
echo $TIMESTAMP
NAME=$(echo $row | cut -d "," -f 2) #CSVの2列目から名前データ取得
echo $NAME
MAIL=$(echo $row | cut -d "," -f 3) #CSVの3列目からメールアドレスデータ取得
echo $MAIL
else
echo "ヘッダー行なので処理しません"
fi
let ReadCount++
done < test.csv
実行結果
このサンプルコードの実行結果は以下のようになります。
$ bash csv_test.sh
ヘッダーなので処理しません
2022/07/20 11:15:31
Tom Brown
test1@test.com
2022/08/01 9:00:01
Kate Spade
test2@test.com
$
参考までに、デバッグ結果も載せておきます。
$ bash -x csv_test.sh
+ReadCount=1
+read row
+'['1'!='1']'
+echo $'\203\203.......202\223'
ヘッダーなので処理しません
+let ReadCount++
+ReadCount=1
+read row
+'[' -n '2022/07/20 11:15:31,Tom Brown,test1@test.com' ']'
+'['2'!='1']'
++echo 2022/07/20 $'11:15:31,Tom Brown,test1@test.com\r'
++cut -d , -f 1
+TIMESTAMP='2022/07/20 11:15:31'
+echo 2022/07/20 11:15:31
2022/07/20 11:15:31
++echo 2022/07/20 $'11:15:31,Tom Brown,test1@test.com\r'
++cut -d , -f 2
+NAME=Tom Brown
echo Tom Brown
Tom Brown
++echo 2022/07/20 $'11:15:31,Tom Brown,test1@test.com\r'
++cut -d , -f 3
+MAIL=test1@test.com
+echo test1@test.com
test1@test.com
+let ReadCount++
+read row
+'[' -n '2022/08/01 9:00:01,Kate Spade,test2@test.com' ']'
+'['2'!='1']'
++echo 2022/08/01 $'9:00:01,Kate Spade,test2@test.com\r'
++cut -d , -f 1
+TIMESTAMP='2022/08/01 9:00:01'
+echo 2022/08/01 9:00:01
2022/08/01 9:00:01
++echo 2022/08/01 $'9:00:01,Kate Spade,test2@test.com\r'
++cut -d , -f 2
+NAME=Kate Spade
echo Kate Spade
Kate Spade
++echo2022/08/01 $'9:00:01,Kate Spade,test2@test.com\r'
++cut -d , -f 3
+MAIL=test2@test.com
+echo test2@test.com
test2@test.com
+let ReadCount++
+read row
+'[' -n '' ']'
$
終わりに
今回は分かりやすく「ヘッダーなので処理しません」と表示していますが、当然これはなくても構いません。
変数名は何でもいいです。わかりやすい名前を付けてあげてください。