4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェルスクリプト忘備録-CSVファイルのデータを処理する-

Last updated at Posted at 2024-06-03

シェルスクリプトでCSVファイルを読み込み、データを整形する機会があったため忘備録として記録に残そうと思います。

想定データ

カンマ区切りのデータを想定します。

1234,test1
5678,test2
9101,test3

スクリプトファイル

CSVファイルを一行ずつ読み込み、カンマ区切りでデータを分けて配列にしたのが以下のスクリプトです。
一致したデータを出力用のCSVファイルに追記する(>>)仕様になっています。

#!/bin/bash

# 読み込むファイル
FILE=test.csv

while read line || [ -n "${line}" ];
do

    # tests[@]:全てのリスト表示
    # tests[0]:1列目のデータ
    # tests[1]:2列目のデータ
    tests=(${line//,/ })

    if [ "${tests[0]}" = "1234" ]; then
        echo -e ${line} >> result1.csv
    elif [ "${tests[0]}" = "5678" ]; then
        echo -e ${line} >> result2.csv
    elif [ "${tests[0]}" = "9101" ]; then
        echo -e ${line} >> result3.csv
    else
        echo "一致しないエラー"
    fi

done < ${FILE}

シェルスクリプトでSplitできる?

結論から言うと、他言語でいう区切り文字指定での分割処理はなさそうでした。
実現手段としてはいくつかあるようですが、今回は区切り文字を半角スペースに置換し、配列のデータとして取り込むことで分割を実現しています。

${line(対象文字列)//,(置換前文字列、カンマ)/ (置換後文字列、半角スペース)}

カンマ区切りを半角スペース区切りに変換

1234,test1 -> 1234 test1

その後、()で囲み、配列に格納する。

1234 test1 -> (1234, test1)

上記をまとめると以下の形になります。
tests=(${line//,/ })

これでカンマ区切りの文字列を配列として操作できるようになります。

参考資料

告知

最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

みなさまからのご応募をお待ちしております。

4
4
1

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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?