> module TableConversion(display, normalize, unpack) > where > import VarianceNormalization(normalizeRowVariance) > import Project3D(table) > import IOutilities > (isEmptyLine, realFloatFromString, > standardFormatRealFloat, scientificFormatRealFloat) > import SequenceUtilities(splitFromRight, transpose) parse table file into its components > unpack :: (RealFloat r, Read r) => > String -> ([String], [String], [String], [[r]]) > unpack tableFile = > (headerLinesWithoutParameterHeading, > parameterIds, dataIds, dataColumns) > where > (headerLines, emptyLine: dataLines) = > (break isEmptyLine . lines) tableFile > (headerLinesWithoutParameterHeading, [parameterHeading]) = > splitFromRight 1 headerLines > parameterIds = words parameterHeading > (dataIds: dataColumnsAsWordSequences) = > (transpose . map words) dataLines > dataColumns = > map (map realFloatFromString) dataColumnsAsWordSequences normalize data component of table file > normalize :: RealFloat r => > ([String], [String], [String], [[r]]) -> > ([String], [String], [String], [[r]]) > normalize(heading, parameterIds, dataIds, dataColumns) = > (heading, parameterIds, dataIds, > normalizeRowVariance dataColumns) interpret table data for display > display :: RealFloat f => > String -> Int -> > ([String], [String], [String], [[f]]) -> String > display format numberOfDigits > (heading, parameterIds, dataIds, dataColumns) = > unlines(heading ++ table 1 tableColumns) > where > tableColumns = zipWith (++) columnLabels dataIdsAndColumns > columnLabels = [[pID, ""] | pID <- parameterIds] > dataIdsAndColumns = > [dataIds] ++ map (map displayDatum) dataColumns > displayDatum > | map toUpper format == "C" > = standardFormatRealFloat numberOfDigits > | otherwise > = scientificFormatRealFloat numberOfDigits