-
Notifications
You must be signed in to change notification settings - Fork 0
/
pcibex-results.hs
45 lines (35 loc) · 1.53 KB
/
pcibex-results.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import Data.List.Split(splitOn)
import System.Environment(getArgs)
import System.IO(readFile, writeFile)
import qualified Data.Map.Strict as Map
relevantLines :: [String] -> Bool
relevantLines result = length result == 13 &&
result !! 5 == "experimental-trial" &&
result !! 7 == "Scale" &&
result !! 10 /= "NA"
-- Extract the user ID, item number, and value given.
toResult :: [String] -> (String, Int, Int)
toResult line = (line !! 0 ++ "-" ++ line !! 1,
read (line !! 3) :: Int,
read (line !! 10) :: Int)
perRating :: String -> [(Int, Int)] -> [(String, Int, Int)]
perRating user = map (\ (item, value) -> (user, item, value))
printResult :: (String, Int, Int) -> String
printResult (user, item, value) = user ++ "," ++ show item ++ "," ++ show value
main :: IO ()
main = do
(inputFile:_) <- getArgs
contents <- readFile inputFile
let results = map toResult
. filter relevantLines
. map (splitOn ",")
$ lines contents
-- Remove users that didn't complete the experiment.
resultsByUser = Map.filter (\ x -> length x == 24)
. Map.fromListWith (++)
$ map (\ (user, item, value) -> (user, [(item, value)])) results
validResults = concat
. map (\ (user, ratings) -> perRating user ratings)
$ Map.toList resultsByUser
writeFile "pcibex-output.csv" . unlines
$ ["user,item,value"] ++ map printResult validResults