82 lines
2.1 KiB
Markdown
82 lines
2.1 KiB
Markdown
# purescript-csv-stream
|
|
|
|
Type-safe bindings for the streaming API of `csv-parse` and `csv-stringify`.
|
|
|
|
## Installing
|
|
```bash
|
|
spago install csv-stream
|
|
{bun|yarn|npm|pnpm} install csv-parse csv-stringify
|
|
```
|
|
|
|
## Examples
|
|
### Stream
|
|
```purescript
|
|
module Main where
|
|
|
|
import Prelude
|
|
|
|
import Effect (Effect)
|
|
import Effect.Class (liftEffect)
|
|
import Effect.Aff (launchAff_)
|
|
import Node.Stream (pipe)
|
|
import Node.Stream as Stream
|
|
import Node.Stream.CSV.Stringify as CSV.Stringify
|
|
import Node.Stream.CSV.Parse as CSV.Parse
|
|
|
|
type MyCSVType1 = {a :: Int, b :: Int, bar :: String, baz :: Boolean}
|
|
type MyCSVType2 = {ab :: Int, bar :: String, baz :: Boolean}
|
|
|
|
atob :: MyCSVType1 -> MyCSVType2
|
|
atob {a, b, bar, baz} = {ab: a + b, bar, baz}
|
|
|
|
myCSV :: String
|
|
myCSV = "a,b,bar,baz\n1,2,\"hello, world!\",true\n3,3,,f"
|
|
|
|
main :: Effect Unit
|
|
main = launchAff_ do
|
|
parser <- liftEffect $ CSV.Parse.make {}
|
|
stringifier <- liftEffect $ CSV.Stringify.make {}
|
|
|
|
input <- liftEffect $ Stream.readableFromString myCSV
|
|
liftEffect $ Stream.pipe input parser
|
|
|
|
records <- CSV.Parse.readAll parser
|
|
liftEffect $ for_ records \r -> CSV.Stringify.write $ atob r
|
|
liftEffect $ Stream.end stringifier
|
|
|
|
-- "ab,bar,baz\n3,\"hello, world!\",true\n6,,false"
|
|
csvString <- CSV.Stringify.readAll stringifier
|
|
pure unit
|
|
```
|
|
|
|
### Synchronous
|
|
```purescript
|
|
module Main where
|
|
|
|
import Prelude
|
|
|
|
import Effect (Effect)
|
|
import Effect.Class (liftEffect)
|
|
import Effect.Aff (launchAff_)
|
|
import Node.Stream (pipe)
|
|
import Node.Stream as Stream
|
|
import Node.Stream.CSV.Stringify as CSV.Stringify
|
|
import Node.Stream.CSV.Parse as CSV.Parse
|
|
|
|
type MyCSVType1 = {a :: Int, b :: Int, bar :: String, baz :: Boolean}
|
|
type MyCSVType2 = {ab :: Int, bar :: String, baz :: Boolean}
|
|
|
|
atob :: MyCSVType1 -> MyCSVType2
|
|
atob {a, b, bar, baz} = {ab: a + b, bar, baz}
|
|
|
|
myCSV :: String
|
|
myCSV = "a,b,bar,baz\n1,2,\"hello, world!\",true\n3,3,,f"
|
|
|
|
main :: Effect Unit
|
|
main = launchAff_ do
|
|
records :: Array MyCSVType1 <- CSV.Parse.parse myCSV
|
|
-- "ab,bar,baz\n3,\"hello, world!\",true\n6,,false"
|
|
csvString <- CSV.Stringify.stringify (atob <$> records)
|
|
pure unit
|
|
```
|