RosettaCodeData/Task/CSV-data-manipulation/Haskell/csv-data-manipulation-1.hs

46 lines
1.4 KiB
Haskell
Raw Permalink Normal View History

2019-09-12 10:33:56 -07:00
import Data.Array (Array(..), (//), bounds, elems, listArray)
2015-02-20 09:02:09 -05:00
import Data.List (intercalate)
import Control.Monad (when)
2019-09-12 10:33:56 -07:00
import Data.Maybe (isJust)
2015-02-20 09:02:09 -05:00
2019-09-12 10:33:56 -07:00
delimiters :: String
2015-02-20 09:02:09 -05:00
delimiters = ",;:"
2019-09-12 10:33:56 -07:00
fields :: String -> [String]
2015-02-20 09:02:09 -05:00
fields [] = []
2019-09-12 10:33:56 -07:00
fields xs =
let (item, rest) = break (`elem` delimiters) xs
(_, next) = break (`notElem` delimiters) rest
in item : fields next
2015-02-20 09:02:09 -05:00
2019-09-12 10:33:56 -07:00
unfields :: Maybe (Array (Int, Int) String) -> [String]
2015-02-20 09:02:09 -05:00
unfields Nothing = []
unfields (Just a) = every fieldNumber $ elems a
2019-09-12 10:33:56 -07:00
where
((_, _), (_, fieldNumber)) = bounds a
every _ [] = []
every n xs =
let (y, z) = splitAt n xs
in intercalate "," y : every n z
fieldArray :: [[String]] -> Maybe (Array (Int, Int) String)
2015-02-20 09:02:09 -05:00
fieldArray [] = Nothing
2019-09-12 10:33:56 -07:00
fieldArray xs =
Just $ listArray ((1, 1), (length xs, length $ head xs)) $ concat xs
2015-02-20 09:02:09 -05:00
2019-09-12 10:33:56 -07:00
fieldsFromFile :: FilePath -> IO (Maybe (Array (Int, Int) String))
2015-02-20 09:02:09 -05:00
fieldsFromFile = fmap (fieldArray . map fields . lines) . readFile
2019-09-12 10:33:56 -07:00
fieldsToFile :: FilePath -> Maybe (Array (Int, Int) String) -> IO ()
2015-02-20 09:02:09 -05:00
fieldsToFile f = writeFile f . unlines . unfields
2019-09-12 10:33:56 -07:00
someChanges :: Maybe (Array (Int, Int) String)
-> Maybe (Array (Int, Int) String)
someChanges =
fmap (// [((1, 1), "changed"), ((3, 4), "altered"), ((5, 2), "modified")])
2015-02-20 09:02:09 -05:00
2019-09-12 10:33:56 -07:00
main :: IO ()
2015-02-20 09:02:09 -05:00
main = do
2019-09-12 10:33:56 -07:00
a <- fieldsFromFile "example.txt"
when (isJust a) $ fieldsToFile "output.txt" $ someChanges a