shokosブログ

プログラミング

CSVファイルで各行の先頭を見て、重複した値があったら取り出すスクリプト

業務で必要になったので、勉強がてらHaskellで書いてみた。

import Data.List.Split

main = do
	csv <- readFile "./foo.csv"
	print $ check $ dataList csv

--各行の先頭をリスト化する
dataList :: String -> [String]
dataList csv = foldr (\x xs -> (head (splitOn "," x)) : xs) [] (lines csv)

--リスト内に重複したデータがあるかチェック
check :: [String] -> [String]
check [] = []
check (x:xs) | elem x xs = x : (check xs)
	     | otherwise = check xs
lines csv

行ごとにリストにする処理がたったこれだけで書けるのにちょっぴり感動した。

checkは再帰で書いたけれど、もう少し考えれば高階関数使って書けそうだな。