LoginSignup
5
2

More than 1 year has passed since last update.

bashスクリプト内でCSVのヘッダー行を飛ばす処理

Last updated at Posted at 2022-08-10

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 '' ']'
$

終わりに

今回は分かりやすく「ヘッダーなので処理しません」と表示していますが、当然これはなくても構いません。
変数名は何でもいいです。わかりやすい名前を付けてあげてください。

5
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2