shellでcsvを扱うテクを Sagasoon.
プログラム初心者さんに送る成長の糧シリーズです。
今回は「改造」ということに主眼を置いて進みますね。
2回に分けて紹介します。
さて、今回はCSVの読み込ませるというプログラムを読み、それを改造するという「遊び」をするんですが、その前に、
「CSVを読み込んで何かの処理をさせる」なんて、なんの意味があるんだ?
なんて思いがちですが・・・。
CSVを読み込むメリット
たとえばDMを考えますか。
単純に、住所録に書いてある方々へ、DMを送信しましょうってだけのことを書きます。
左の黒い丸からはじまりです。
- 住所録読み込み
- DM送信
名簿(住所録)を読み込んで、そこに書かれている人たちへ、DM送信(メール送信)するってことです。
一人ずつ、手動でやってたららちがあきません。
自動でやらせる意味が分かってもらえるかと。
また、名簿がCSVだったりりすれば、この話の意味が通じるんじゃないでしょうか。
その前に、shellとかCSVってなんですか?
あ、そうそう。
shellって何?
CSVってなんだ?
ってなる方もいらっしゃるかもですね。
shellについて
一先ず、shellっていうのは、linuxとかで使う「小さなプログラム」ぐらいで覚えておいてください。
細かいことは、下記のリンクをみていただければ。
csvについて
顧客名簿なんてのを思い浮かべてください。
- 名前
- 会社名
- 連絡先
などの項目が、表にまとまってるやつです。
この「表」を、テキストファイルで「カンマ」区切りで保存してあるものを CSVファイル って呼んでます。
こんな感じです。
address.csv
日本太郎,日本〇〇商事,xxx-xxxx-xxxx 日本花子,日本〇〇工務店,zzz-zzzz-zzzz 日本次郎,日本〇〇ペンキ,yyy-yyyy-yyyy
前置きはこのへんで。
shellで読ませる
さて、本題です。
DM送信プログラムを解説するのも、ちょっとあれなので、今回は仮想のサイトを想定して話をすすめますね。
このWEBサイトは、「在庫商品を検索して、その商品がどこにあるか確認する」ってのが目的です。
このサイトに、テストユーザを作りました。
テストユーザを、CSVファイルにまとめました。
id_list.csv
test001,テスト001,テストするときのアカウント1号 test011,テスト011,テスター1号に割り振ったアカウント test012,テスト012,テスターAさんに割り振ったアカウント
今回は、このテストユーザが、このサイトでどんなことをしたかな?というのを探すことにしましょう。
まずは、サンプル作りです。
CSVを読み込むところだけ、作ってみますね。
#!/bin/sh cat id_list.csv | while IFS=, read id name biko do echo "$id ($name) :$biko" done
catの説明は、こちらの記事で確認してください。
catは、猫じゃないです。ファイルの中身を出力するってコマンドです。
whileは「指定した状況になってる間は、do~doneをループしなさい」って命令です。
それが縦棒の「|」で連結されてる感じですね。
簡単に言いと
ファイルを1行ずつ読み込み、中身が無くなるまで繰り返しなさい。
読み込んだ文字は、毎回、do~doneで書いてあることをやりなさい
って感じです。
実行してみると、下記のような結果がでてきます。
test001 (テスト001) :テストするときのアカウント1号 test011 (テスト011) :テスター1号に割り振ったアカウント test012 (テスト012) :テスターAさんに割り振ったアカウント
入力させた id_list と、形式が変わってでてきましたね。
このファイルを入力させたときは、
test001,テスト001,テストするときのアカウント1号
だったんですからね。
カンマ区切りになっていた1行1行が、要素ごとに取得してくれたんだな?と勘づいてくださいね。
どこで要素ごとに取得したか?
プログラム初心者さんは、こうゆうところで「気づき」とかおきると、プログラムが楽しくなります。
画面にいつだしたんだろ?
画面に出力してたのはどこでしょう?
test011 (テスト011) :テスター1号に割り振ったアカウント
って出てましたね。プログラムをみてみてください。
echo "$id ($name) :$biko"
ってところがありますよね。
似てますね。
ためしに、変えてみてください。
echo "$name って人が $id のIDを使ってます($biko)"
あぁ~。ってなりましたか?
1行読んだ文字をIDとか名前とかの要素にバラバラにどうやってしたの?
画面に出力した時、なんか「変数みたいの」を使ってましたね。
echo "$id ($name) :$biko"
画面に出てたのは、
test001 (テスト001) :テストするときのアカウント1号
です。
なんかにおいますか?
- $id が test001
- $name が テスト001
- $biko が テストするときのアカウント1号
に対応してそうな気がしませんか?
ってことは?
なんか、その前に、こんなことをしてますね?
while IFS=, read id name biko
idとnameとbikoをなんかしてそうですよね?
これらの前に、 read (読み込め)なんて英語も書いてあります。
もう少しみると、IFSのところに「,」(カンマ)もあります。
あれ?CSVってカンマ区切りだったよな・・・。
こうやって「推測」して「改造する」して「遊ぶ」んです。
まとめ
今日はここまでです。
初心者の方は、初めから自分で一からプログラムを作らずに、こうゆうプログラムを改造するほうが勉強になります。
シンタックスなんて勉強する必要ないです。改造しようとしたときに、「どうやるんだろ?」ってその都度知ればいいです。
次回は、このシェルプログラムを、もう少し改造しますね。
コメント