Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Opinionated JSON to CSV/XLSX/SQLITE/PARQUET converter. Flattens JSON fast.

License

NotificationsYou must be signed in to change notification settings

kindly/flatterer

Repository files navigation

Full Documentation

Introduction

An opinionated JSON to CSV/XLSX/SQLITE/PARQUET converter which tries to make a useful relational output for data analysis.

Web playgroud of CSV/XLSX conversions

Rationale

When receiving a JSON file where the structure is deeply nested or not well specified, it is hard to determine what the data contains. Also, even after knowing the JSON structure, it requires a lot of time to work out how to flatten the JSON into a relational structure to do data analysis on and to be part of a data pipeline.

Flatterer aims to be the first tool to go to when faced with the above problem. It may not be the tool that you end up using to flatten the JSON in your data pipeline, as hand written flattening may be required, but it could be. It has many benefits over most hand written approaches:

  • It is fast, written in rust but with python bindings for ease of use. It can be 10x faster than hand written python flattening.
  • Memory efficient. Uses a custom streaming JSON parser to mean that long list of objects nested with the JSON will be streamed, so not much data needs to be loaded into memory at once.
  • Fast memory efficient output to CSV/XLSX/SQLITE/PARQUET
  • Uses best practice that has been learnt from flattening JSON countless times, such as generating keys to link one-to-many tables to their parents.

Install

pip install flatterer

Flatterer requires Python 3.6 or greater. It is written as a python extension in Rust but has binaries (wheels) for linux (x64), macos (x64 and universal) and windows (x64, x86). On other platforms a rust toolchain will need to be installed.

Example JSON

Say you have a JSON data like this namedgames.json:

[  {"id":1,"title":"A Game","releaseDate":"2015-01-01","platforms": [      {"name":"Xbox"},      {"name":"Playstation"}    ],"rating": {"code":"E","name":"Everyone"    }  },  {"id":2,"title":"B Game","releaseDate":"2016-01-01","platforms": [      {"name":"PC"}    ],"rating": {"code":"E","name":"Everyone"    }  }]

Running Flatterer

Run the above file with flatterer.

flatterer games.json games_dir

Output Files

By running the above you will get the following files:

tree games_dirgames_dir/├── csv│   ├── games.csv│   └── platforms.csv├── datapackage.json├── fields.csv└── ...

Main Table

games.csv contains:

_link_link_gamesidrating_coderating_namereleaseDatetitle
111EEveryone2015-01-01A Game
222EEveryone2016-01-01B Game

Special column_link is generated._link is the primary key there unique per game.

Also therating sub-object is promoted to this table it has a one-to-one relationship withgames.Sub-object properties are separated by '_'.

One To Many Table

platforms is an array so is a one-to-many with games therefore needs its own table:platforms.csv contains:

_link_link_gamesname
1.platforms.01Xbox
1.platforms.11Playstation
2.platforms.02PC

Link Fields

_link is the primary key for theplatforms table too. Every table exceptgames table, contains a_link_games field to easily join to the maingames table.

If there was a sub-array ofplatforms then that would have_link,_link_games and_link_platforms fields.

To generalize this the_link__<table_name> fields joins to the_link field of<table_name> i.e the_link__<table_name> are the foreign keys refrencing<table_name>._link.

Fields CSV

fields.csv contains some metadata about the output tables:

table_namefield_namefield_typecountfield_title
platforms_linktext3_link
platforms_link_gamestext3_link_games
platformsnametext3name
games_linktext2_link
gamesidnumber2id
gamesrating_codetext2rating_code
gamesrating_nametext2rating_name
gamesreleaseDatedate2releaseDate
gamestitletext2title

Thefield_type column contains a type guess useful for inserting into a database. Thefield_title is the column heading in the CSV file or XLSX tab, which is initally the same as the field_name.After editing this file then you can rerun the transform:

flatterer games.json new_games_dir -f myfields.csv --only-fields

This can be useful for renameing columns, rearranging the field order or if you want to remove some fields the--only-fields flag will only include the fields in the edited file.

datapackage.json contains metadata in theTabular Datapackge Spec


[8]ページ先頭

©2009-2025 Movatter.jp