Flat Data: Postprocessing Library and Examples

A collection of postprocessing helper functions and examples for Flat Data.

These examples and functions are written in Deno, a new language created by the same founders of Node.js and meant to improve on many aspects of Node.

Note: If you’re noticing your scripts failing recently, try updating to 0.0.14. More info here

Usage

When writing a Flat Data Action, you can specify a path to a postprocessing Deno script that can manipulate the data downloaded by Flat even further.

- name: Fetch data 
        uses: githubocto/flat@v2
        with:
          http_url: http://api.coindesk.com/v2/bpi/currentprice.json # The endpoint to fetch
          downloaded_filename: btc-price.json # The http_url gets saved and renamed in our repository as btc-price.json
          postprocess: postprocess.ts # A postprocessing javascript or typescript file written in Deno

This is an example of a postprocessing script. Notice the use of Deno.args[0] to pass in the path of the downloaded_filename.

// The Flat Data postprocessing libraries can be found at https://deno.land/x/flat/mod.ts
// Replace 'x' with latest library version
import { readJSON, writeJSON } from 'https://deno.land/x/flat@0.0.x/mod.ts'

const filename = Deno.args[0] // equivalent to writing `const filename = 'btc-price.json'`
const data = await readJSON(filename)

// pluck a specific key off and write it out to a new file
const newfile = `postprocessed_${filename}`
await writeJSON(newfile, data.path.to.something)

Examples

Can be found in the examples folder. Once you install Deno you can run these examples with:

  • deno run -A examples/csv/csv-example.ts
  • deno run -A examples/csv/arquero-example.ts
  • deno run -A --unstable examples/image/image-example.ts
  • deno run -A examples/json/json-example.ts
  • deno run -A examples/sheets/sheets-example.ts
  • deno run -A examples/xlsx/xlsx-example.ts
  • deno run -A --unstable examples/zip/zip-example.ts

Deno can run javascript or typescript files, so you can easily convert any of these examples to javascript and run them in the same way:

deno run -A examples/csv/csv-example.js

Using Python

While our examples use a Deno file to run postprocessing tasks, you can also use Python as specified in this example: https://github.com/pierrotsmnrd/flat_data_py_example. Thank you @pierrotsmnrd!

Using bash

You can also use bash as specified in this example: https://github.com/aborruso/flat_data_bash_example. By @aborruso

Postprocessing Library

The Flat Data postprocessing library can be found at: https://deno.land/x/flat/mod.ts

You can import and use these helper functions directly, or treat them as a starting point for writing your own postprocessing scripts.

CSV

readCSV

readCSV(path: string, options?: ParseOptions): Promise<Record<string, unknown>[]>

Args:

  • path: path to a local CSV file
  • options: options for parsing the CSV file

Usage:

const csv = await readCSV('./path/to/file.csv')

writeCSV

writeCSV(path: string, data: Record<string, unknown>[] | string, options?: Deno.WriteFileOptions)

Args:

  • path: path to a local CSV file
  • data: string or object array to store
  • options: options for writing the CSV file

Usage:

const data = [ 
    { age: 70, name: 'Rick' },
    { age: 14, name: 'Smith' }
]
await writeCSV('./path/to/file.csv', data)

TXT

readTXT

readTXT(path: string): string

Args:

  • path: path to a local TXT file

Usage:

const text = await readTXT('./path/to/file.txt')

writeTXT

writeTXT(path: string, text: string, options?: Deno.WriteFileOptions): void

Args:

  • path: path to a local TXT file
  • text: text to write to file
  • options: options for writing the TXT file

Usage:

await writeTXT('./path/to/file.txt', 'Content for the file')

JSON

readJSON

readJSON(path: string): JSON

Args:

  • path: path to a local JSON file

Usage:

const json = await readJSON('./path/to/file.json')

readJSONFromURL

readJSONFromURL(url: string): JSON

Args:

  • url: URL to a json file

Usage:

const json = await readJSON('www.url.com/file.json')

writeJSON

writeJSON(path: string, data: any, replacer?: any, space?: string | number): void

Args:

  • path: path to a local JSON file
  • data: data to store as JSON
  • replacer: replacer function that transforms the results or an array of strings and numbers that acts as an approved list for selecting the object properties that will be stringified
  • space: adds indentation, white space, and line break characters to the to the JSON text to make it easier to read.

Usage:

const data = { age: 40 }
await writeJSON('./path/to/file.json', data)

await writeJSON('./path/to/file-with-indentation', data, null, 2)

XLSX

Our library relies on SheetJS, a library for parsing various spreadsheet formats. In addition to a simple readXLSX function you can access the core xlsx module by importing it directly.

import { xlsx, readXLSX } from 'https://deno.land/x/flat/mod.ts'

xlsx provides many more utility functions.

readXLSX

readXLSX(path: string): XLSX.WorkBook

Args:

  • path: path to a local XLSX file

Usage:

const workbook = await readXLSX('./path/to/file.xlsx')
const sheetData = workbook.Sheets[workbook.SheetNames[0]]
const csvString = await xlsx.utils.sheet_to_csv(sheetData)

Image

We recommend using a library like imagescript for more advanced image manipulation. See an example here.

readImageFromFile

readImageFromFile(path: string): Promise<Uint8Array>

Args:

  • path: path to a local image file

Usage:

const bytes = await readImageFromFile('./path/to/image.jpeg')

readImageFromURL

readImageFromURL(url: string): Promise<{ bytes: Uint8Array; name: string; }>

Args:

  • url: url string to an image

Usage:

const image = await readImageFromURL('www.url.com/image.jpg')
const bytes = image.bytes
const name = image.name

writeImage

writeImage(imageBytes: Uint8Array, path: string): void

Args:

  • imageBytes: a byte array
  • path: path and name to write the image file

Usage:

await writeImage(bytes, './path/to/image.jpeg')

Zip

unZipFromFile

unZipFromFile(
    filePath: string,
    destinationPath: string | null = "./",
    options: any = {},
): Promise<string | false>

Args:

  • filePath: a path to a local zip file
  • destinationPath: a folder path to unzip the files
  • options: option.includeFileName can be true or false

Usage:

const result = await unZipFromFile('./path/to/folder.zip', './unzip/path')
const output = result ? 'File unzipped successfully' : 'Error unzipping'

unZipFromURL

unZipFromURL(
    fileURL: string,
    destinationPath: string | null = "./",
    options: any = {},
): Promise<string | false>

Args:

  • filePath: a path to a local zip file
  • destinationPath: a folder path to unzip the files
  • options: option.includeFileName can be true or false

Usage:

const result = await unZipFromURL('www.url.com/file.zip', './unzip/path')
const output = result ? 'File unzipped successfully' : 'Error unzipping'

Remove

removeFile

removeFile(path: string): void

Args:

  • path: path to a local file to delete

Usage:

await removeFile('/path/to/file.x')

Testing

Run all the tests:

deno test -A --unstable tests/*

Run separate tests

deno test -A --unstable tests/csv-test.ts

License

MIT