csv-nptools (empty) → 0.2.0
raw patch · 8 files changed
+176/−0 lines, 8 filesdep +basedep +jsondep +txt-sushisetup-changed
Dependencies added: base, json, txt-sushi
Files
- Setup.hs +3/−0
- csv-add-id.hs +22/−0
- csv-nptools.cabal +47/−0
- csv-pad.hs +6/−0
- csv-reformat.hs +34/−0
- csv-tr.hs +30/−0
- csv-transpose.hs +8/−0
- csv2json.hs +26/−0
+ Setup.hs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+import Distribution.Simple+main = defaultMain
+ csv-add-id.hs view
@@ -0,0 +1,22 @@+import System.Environment+import Data.Char+import Utils++addIdLn :: Int -> [String] -> [String]+addIdLn 0 = ("ID":)+addIdLn i = (show i:)++addId :: Int -> FilePath -> IO ()+addId i = interactTable $ zipWith addIdLn [i..]++main :: IO ()+main = do+ args <- getArgs+ let (args2, start) =+ case args of+ "--help":_ -> err+ "--start":i:xs+ | all isDigit i -> (xs, read i)+ _ -> (args, 0)+ addId start $ getInput err args2+ where err = error "Usage: csv-add-id [--start <int>] [<file>|-]"
+ csv-nptools.cabal view
@@ -0,0 +1,47 @@+Name: csv-nptools+Cabal-Version: >=1.4+Version: 0.2.0+License: GPL+Copyright: (c) Nicolas Pouillard+Author: Nicolas Pouillard+Maintainer: Nicolas Pouillard <nicolas.pouillard@gmail.com>+Category: Development, Text, Utils+Synopsis: A collection of CSV tools+Description: A collection of CSV tools+Stability: Experimental+Build-Type: Simple++--executable csv2html+-- main-is: csv2html.hs+-- Build-depends: base>=3&&<5, html, tabular, csv+-- ghc-options: -Wall -Odph++executable csv2json+ main-is: csv2json.hs+ Build-depends: base>=3&&<5, txt-sushi, json+ ghc-options: -Wall -Odph++executable csv-add-id+ main-is: csv-add-id.hs+ Build-depends: base>=3&&<5, txt-sushi+ ghc-options: -Wall -Odph++executable csv-reformat+ main-is: csv-reformat.hs+ Build-depends: base>=3&&<5, txt-sushi+ ghc-options: -Wall -Odph++executable csv-tr+ main-is: csv-tr.hs+ Build-depends: base>=3&&<5, txt-sushi+ ghc-options: -Wall -Odph++executable csv-transpose+ main-is: csv-transpose.hs+ Build-depends: base>=3&&<5, txt-sushi+ ghc-options: -Wall -Odph++executable csv-pad+ main-is: csv-pad.hs+ Build-depends: base>=3&&<5, txt-sushi+ ghc-options: -Wall -Odph
+ csv-pad.hs view
@@ -0,0 +1,6 @@+import System.Environment (getArgs)+import Utils (interactTable,padTbl,getInput)++main :: IO ()+main = interactTable (padTbl "") . getInput err =<< getArgs+ where err = error "Usage: csv-pad [<file>|-]"
+ csv-reformat.hs view
@@ -0,0 +1,34 @@+import Control.Arrow+import System.Environment+import System.Console.GetOpt+import Database.TxtSushi.FlatFile+import Utils++reformat :: (String, String) -> FilePath -> IO ()+reformat (inDelim, outDelim)+ = (putStr . formatTable outFormat . parseTable inFormat =<<)+ . getContentsFromFileOrStdin+ where inFormat = mkFormat inDelim+ outFormat = mkFormat outDelim+ mkFormat delim = Format "\"" delim ["\n","\r","\r\n","\n\r"]++type Settings = (String, String)+type Flag = Settings -> Settings++options :: [OptDescr Flag]+options =+ [ Option "d" [] (ReqArg (first . const . evalStr) "STRING") "Input delim (default ',')"+ , Option "D" [] (ReqArg (second . const . evalStr) "STRING") "Output delim (default 0xfe)"+ ]++usage :: String -> a+usage msg = error $ unlines [msg, usageInfo header options]+ where header = "Usage: csv-reformat [-d <input-delim>] [-D <output-delim>] [<file-or-dash>]"++main :: IO ()+main = do args <- getArgs+ let (flags, nonopts, errs) = getOpt Permute options args+ opts = foldr ($) (",", "\254") flags+ err = usage (concat errs)+ if null errs then reformat opts (getInput err nonopts)+ else err
+ csv-tr.hs view
@@ -0,0 +1,30 @@+import System.Environment+import Utils++csvTrCell :: String -> String -> (String -> String)+csvTrCell src dst = foldr ((.).map) id $ zipWith' err substChar src dst+ where err = error "Source and destination should have the same length"++csvTr :: String -> String -> FilePath -> IO ()+csvTr src dst = interactTable (map . map $ csvTrCell (onStr src) (onStr dst))+ where onStr = expandRanges . evalStr++main :: IO ()+main = do+ args <- getArgs+ case args of+ src : dst : xs -> csvTr src dst (getInput err xs)+ _ -> err++ where err = error $ unlines ["Usage: csv-tr <src> <dst> [<file>|-]"+ ,"Examples: csv-tr ',\\n\\t' '...'"+ ," csv-tr a-z A-Z"+ ,"Characters:"+ ,"\\a <alert character>"+ ,"\\b <backspace>"+ ,"\\f <form-feed>"+ ,"\\n <newline>"+ ,"\\r <carriage return>"+ ,"\\t <tab>"+ ,"\\v <vertical tab>"+ ]
+ csv-transpose.hs view
@@ -0,0 +1,8 @@+import Data.List (transpose)+import System.Environment (getArgs)+import Utils (interactTable,padTbl,getInput)++main :: IO ()+main = interactTable (transpose . padTbl "") . getInput err =<< getArgs+ where err = error "Usage: csv-transpose [<file>|-]"+
+ csv2json.hs view
@@ -0,0 +1,26 @@+import Data.Functor+import Text.JSON+import Database.TxtSushi.FlatFile+import System.Environment+import Utils++{-+ Encoding note:+ Nothing fancy is done about encoding, on both ends.+ So it basically works for UTF-8 which does not mess+ up with the delimitors of both CSV and JSON.+ -}++csv2json :: FilePath -> IO JSValue+csv2json =+ fmap (JSArray . map (JSArray . map (JSString . toJSString))+ . parseTable csvFormat)+ . getContentsFromFileOrStdin++main :: IO ()+main = putStrLn . encode . mayJSArray+ =<< mapM csv2json . addDefaultInput+ =<< getArgs++ where mayJSArray [x] = x+ mayJSArray xs = JSArray xs