Этот ответ грамотный Haskell , поэтому вы можете скопировать и вставить его в файл с именем table.lhs
, чтобы получить работающую программу.
Начиная с нескольких операций импорта
> import Control.Arrow ((&&&))
> import Control.Monad (forM_)
> import Data.List (intercalate,isPrefixOf)
> import Data.Maybe (fromJust)
и скажем, что мы представляем таблицу со следующей записью:
> data Table = Table { tblName :: String
> , tblCols :: [String]
> , tblVals :: [String]
> }
> deriving (Show)
То есть мы записываем имя таблицы, список имен столбцов и список значений столбцов.
Каждая таблица во входных данных начинается со строки, начинающейся с TABLE
, поэтому разделите все строки во входных данных соответствующим образом:
> tables :: [String] -> [Table]
> tables [] = []
> tables xs = next : tables ys
> where next = mkTable (th:tt)
> (th:rest) = dropWhile (not . isTable) xs
> (tt,ys) = break isTable rest
> isTable = ("TABLE" `isPrefixOf`)
Разделив входные данные в таблицы, имяданная таблица является первым словом в строке TABLE
.Имена столбцов - это все слова, которые появляются в COLUMNS
строках, а значения столбцов взяты из VALUES
строк:
> mkTable :: [String] -> Table
> mkTable xs = Table name cols vals
> where name = head $ fromJust $ lookup "TABLE" tagged
> cols = grab "COLUMNS"
> vals = grab "VALUES"
> grab t = concatMap snd $ filter ((== t) . fst) tagged
> tagged = map ((head &&& tail) . words)
> $ filter (not . null) xs
Учитывая запись Table
, мы печатаем ее, вставляя имена, значения,и ключевые слова SQL вместе в соответствующем порядке в одной строке:
> main :: IO ()
> main = do
> input <- readFile "input"
> forM_ (tables $ lines input) $
> \t -> do putStrLn $ intercalate " " $
> "TABLE" : (tblName t) :
> ("COLUMNS" : (tblCols t)) ++
> ("VALUES" : (tblVals t))
При неимитирующем вводе
TABLE name_of_table
COLUMNS first_column 2nd_column [..] n-th_column
VALUES 1st_value 2nd_value [...] n-th value
VALUES yet_another_value ... go on
TABLE name_of_table
COLUMNS first_column 2nd_column [..] n-th_column
VALUES 1st_value 2nd_value [...] n-th value
VALUES yet_another_value ... go on
вывод составляет
$ runhaskell table.lhs
TABLE name_of_table COLUMNS first_column 2nd_column [..] n-th_column VALUES 1st_value 2nd_value [...] n-th value yet_another_value ... go on
TABLE name_of_table COLUMNS first_column 2nd_column [..] n-th_column VALUES 1st_value 2nd_value [...] n-th value yet_another_value ... go on