09

15

[Haskell] Haskellで CSVファイルを 読む

2012.09.15(09:27)

練習用に1ステップずつやってみる。

まず、リストを、指定した要素が最初に現れる前までと、その要素より後ろに分ける関数を作る。

{-# OPTIONS -Wall -Werror #-}
import System.IO

split::(a->Bool)->[a]->([a],[a])
split _ [] = ([],[])
split p (x:xs)
      | p x       = ([],xs)
      | otherwise = (x:ys,zs)
      where (ys,zs) = split p xs
  


次に、それを使って、コンマ区切りの単語が入った文字列を単語のリストに分ける関数を作る

csv2list::String->[String]
csv2list [] = []
csv2list line = first:csv2list other
  where (first,other) = split (\x->x==',') line
 


次に、それを使って、CSVファイルを読んで1行ずつ、単語のリストに分解して、標準出力する。

main :: IO ()
main = do
  h <- openFile "sample.csv" ReadMode
  contents <- hGetContents h
  let csvReader = map show . map csv2list . lines
  mapM_ putStrLn $ csvReader contents
  hClose h
 


sample.csvファイル

word11,word12,word13
word21,word22,,
,word32,,word34,
,,word43
word51
,

word81


実行例

["word11","word12","word13"]
["word21","word22",""]
["","word32","","word34"]
["","","word43"]
["word51"]
[""]
[]
["word81"]

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示