数値のリストををcsvファイルに出力する

Text.CSV を使えば csv ファイルを書き出せるのですが、String の要素にしか対応していません。数値であっても一度 String に変換しないといけないので、コードも結果も不格好です。

import Text.CSV

putStrLn . printCSV $ fmap (fmap show) [[1,2,3], [4,5,6]]
"1","2","3"

"4","5","6"

そこで、数値を String に変換しないものを作ってみようと思います。

newtype Rec a = Rec [[a]]

 

joint :: String -> [String] -> String

joint = intercalate

 

printRec :: Show a => Rec a -> String

printRec (Rec xss) = joint "¥n" $ fmap (joint "," . fmap show) xss

joint を定義せずに intercalate のまま使っても良いのですが、どうも読んでいてしっくりこないのでこうしました。ためしてみましょう。

> putStrLn $ printRec (Rec [[1,2,3],[4,5,6]])

1,2,3

4,5,6

良さそうです。ファイルに出力したければ、writeFile に喰わせてあげればOKです。今回は a -> String を show 関数に任せましたが、Text.Printf を使って書式を指定することもできると思います。

では。