Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

「Try Kotlin」で「CSV変換機」作成に挑戦!(ほぼネタ)

 どうも!LSSです!!

 

 AndroidStudio+Kotlinでアプリ開発の勉強中です。

 

 最近、CSVファイルについて人と話す機会があったので、CSVデータを整形する方法をいくつか考えたのですが、

「そうだ、Kotlinでやってしまおう!」

と思いついたので、記事にしてみます^^

 

※ただ、実際に利用するには自分でKotlinの文字列データを変換する部分を書く必要があります^^;ので記事タイトルには「ほぼネタ」とつけさせていただきました。

 

 

また、Try Kotlinへのリンク張ります

 

try.kotlinlang.org

↑このリンクをクリックするだけで、ブラウザ上でKotlinを試せる環境が出てきます^^

 

 

CSVファイルとは?

 

 表形式のデータを「,」(カンマ)区切りで列を、改行で行を表現する事で、テキストファイルで表現したファイルです。
※名前から、Comma Separated Valueと「カンマで区切った値」の略称となっています。

 

 通常、拡張子「.csv」で作られます。

 

 例えば、

TEL1,TEL2,TEL3,姓,名
090,1234,5678,山田,太郎
080,9876,5432,田中,瑠璃子
070,3141,5926,遠周,律夫

中身が↑こんな感じのCSVファイルがあったとして、表計算ソフト(Excelとか)で開くと

 

f:id:little_strange:20200222225503p:plain

↑こんな感じの表として表示されます。

(数字を勝手に数値として扱われるせいで090→90に変換されてしまうのが難点^^;)

 

 

Try KotlinでCSV変換機を作ってみました!

 

f:id:little_strange:20200222225848p:plain

↑画面的にはこんな感じ。

 

 コードは、

 

val csv=
"""
TEL1,TEL2,TEL3,姓,名
090,1234,5678,山田,太郎
080,9876,5432,田中,瑠璃子
070,3141,5926,遠周,律夫
"""
fun main(args: Array<String>) {
    println("電話番号,氏名")

    val retsuArr=csv.split("\n")
    var i=2
    while(i < retsuArr.size){
        if(retsuArr[i] != ""){
            val koumokuArr = retsuArr[i].split(",")

            /*変換&出力処理 ここから*/

            val tel = "${koumokuArr[0]}-${koumokuArr[1]}-${koumokuArr[2]}"
            val shimei = "${koumokuArr[3]} ${koumokuArr[4]}"

            println("$tel,$shimei")

            /*変換&出力処理 ここまで*/
        }
        i++
    }
}

 

↑このように書きました。

 

 

処理概要

 

TEL1,TEL2,TEL3,姓,名
090,1234,5678,山田,太郎
080,9876,5432,田中,瑠璃子
070,3141,5926,遠周,律夫

 

という形式のデータを、

 

電話番号,氏名
090-1234-5678,山田 太郎
080-9876-5432,田中 瑠璃子
070-3141-5926,遠周 律夫

 

という形式に変換してくれるソフトです。

 

 

使い方

 

まずコードをTry Kotlinにコピペ

 まず、Try Kotlinを開き、上記コードをコピペします。

 

CSVファイルをテキストとして開き、Kotlinコード内に埋め込み

 次に、変換したい元のCSVファイルを、テキストファイルとして開きます。

WindowsならCSVファイルを右クリックして「プログラムから開く」で「メモ帳」を選択するなど)

 

 そしてその内容のテキストを全選択して、

”””

で挟まれた部分に上書き貼り付けします!

 

val csv=
"""
TEL1,TEL2,TEL3,姓,名
090,1234,5678,山田,太郎
080,9876,5432,田中,瑠璃子
070,3141,5926,遠周,律夫
"""

 

↑この緑文字の部分ですね。

 

実行ボタンクリック

で、データ形式が↑のと同じで、出力したいのも同じであれば右上の

f:id:little_strange:20200222231054p:plain

をクリックして、左下の

f:id:little_strange:20200222231208p:plain

をまたテキストを全選択してCSVファイルにコピペすれば完了です^^

 

ただ…実際に利用するには処理部分を書き換えないと^^;

とは言っても、変換したい内容って場合によって色々で、

「元のCSVの表すデータ形式」を「結果出力したいデータ形式」にどう変換するかの部分は、それにあわせて書き換える必要がでてきます^^;;;

 

 現在のサンプルは

            /*変換&出力処理 ここから*/

            val tel = "${koumokuArr[0]}-${koumokuArr[1]}-${koumokuArr[2]}"
            val shimei = "${koumokuArr[3]} ${koumokuArr[4]}"

            println("$tel,$shimei")

            /*変換&出力処理 ここまで*/

という部分で、この中身の変更ですね。

カンマで区切られた一つ目のデータがkoumokuArr[0]に、二つ目のデータがkoumokuArr[2]に、という具合に格納されています。

 

 このサンプルの場合は

「1列目、2列目、3列目(koumokuArr[0~2])を-で連結したものを、変数telに入れる」

「4列目、5列目(koumokuArr[3と4])を全角スペースで連結したものを、変数shimeiに入れる」

という処理をくわえた上で、

            println("$tel,$shimei")

 で、その2つの間にカンマを入れて出力しています。

 

あ、あと、最初に

    println("電話番号,氏名")

で項目行を出力しているので、ここも出力したい結果に合わせて書き換える必要があります。

 

 

余談:var i=2について

 

ループ処理で、val koumokuArr = retsuArr[i].split(",")としてi番目のretsuArrを処理していますが、そのretsuArrの添え字は

f:id:little_strange:20200222233057p:plain

↑こうなっています。

 0は0文字の文字列、1は項目名の行なので、実際のデータは入ってるのは2からだからですね。

  

 

プログラム書ける人にしか使えないものですね^^;

 

 実用性はだいぶ怪しい…。

ですが、誰かの参考程度にでもなればいいな、と記事にしてしまいますwww

 

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくお願いいたします^^