Data Tools

Loading…

Thirty-seven tools for data and the formats it arrives in

The survey these applications are chosen from calls this the group Rust is strongest at, and it is right: a parser and a codec are exactly what the language is for. Every tool here takes one document in and gives one out, runs as WebAssembly inside this browser tab, and makes no request while it works β€” which matters more here than almost anywhere, because the input to one of these is usually a database export, a network capture with an authorisation header in it, or a file of customer records somebody wants anonymised before it goes anywhere.

Documents first: a comparison that knows two documents with the same values in a different key order are the same document, a path expression, a flattener, the array-to-lines conversion, a key sorter for making two versions comparable, an escaper that counts how many rounds a string had been through, and a schema both inferred and checked against. Then tables β€” columns picked and renamed, duplicates found after the normalising you choose, tables merged by column *name* rather than by position, delimiters and decimal points changed together, Markdown and HTML in both directions, fixed-width files, a row-by-row comparison on a key, and an anonymiser that gives the same value the same replacement every time so that the table still joins to itself.

Then the flat configuration formats, each converted to the others with its comments carried where the target has any. Then data turned into code: TypeScript, Rust and Go types worked out from examples, a `CREATE TABLE` worked out from values, insert statements escaped the way each database wants, and a diagram drawn from a schema. Then bytes β€” a hex dump, a binary comparison, a Base64 inspector that says what the bytes turned out to be, gzip and deflate both ways, MessagePack and CBOR with a listing of what every byte was for, and a protocol-buffer message read without its schema. Last, the two files a machine wrote: a log split into fields and counted, and a network capture with the credentials in it pointed out.

One document

JSON diff
Compares two documents by what they mean, not by how they are written.

Flatten JSON
A nested document as one path a line, and back again.

Sort JSON keys
Puts the keys in order so that two versions can be compared.

JSON string escape
A text as a JSON string, and back β€” however many times it was escaped.

Rows and columns

CSV columns
Picks, renames, reorders and filters the columns of a table.

Table to Markdown
A table as Markdown, HTML or lined-up text, with the columns aligned.

Markdown table editor
Adds, drops, moves or sorts a column and gives the table back with the pipes lined up.

Table diff
Compares two tables on a key and shows what changed, cell by cell.

Anonymise a table
Replaces names, addresses and numbers, the same value the same way every time.

Configuration files

Dotenv converter
An environment file as JSON, YAML, TOML or the other flat formats.

INI converter
An INI file as JSON, YAML or TOML, sections kept as levels.

Data as code

JSON to Rust
Structures with serialisation attributes and the renames a Rust name needs.

JSON to Go
Structures with serialisation tags and exported field names.

Data to SQL schema
A CREATE TABLE worked out from the values, with the key candidates named.

Bytes

Hex viewer
Bytes with their offsets and a text column, and what the header says.

Binary file diff
Byte for byte, with the offset and length of every differing run.

Base64 inspector
Decodes a string and says what kind of file it turned out to be.

Protobuf decoder
A message split into field numbers and values, without its schema.

A database file

SQLite viewer
The header, the schema and the rows of a SQLite database, read here rather than uploaded. Not a query engine.

What a machine wrote

Log file parser
Splits lines into fields, filters them, and counts what happened most.

Questions

Which tools from the group are missing?
Two. A SQLite viewer, because the input here is a text area and a database file never becomes text β€” and because browsing one usefully means running queries, which means a query engine, which is a bigger thing than this whole application. And a Markdown table *editor*, because editing in a grid is not what this framework does; the conversion and formatting half of that job is here under the table tools.
Why is a comparison structural rather than textual?
Because a textual comparison of two JSON documents reports every line as changed when somebody's formatter reordered the keys, and reports a change when `1` was rewritten as `1.0`. Neither is a change to anybody reading the file. What is listed here is only what a reader would call a difference β€” which is the entire reason to open the tool.
Can it read every YAML file?
No, and it says which part it reads: block mappings and sequences, flow collections, quoted and plain scalars, comments and the block scalars. Anchors, aliases and tags it **refuses by name** rather than dropping β€” a converter that silently lost an anchor would produce a file that looks right and means something else, which is worse than refusing. The same rule holds for the path expressions and for JSON Schema.
Why does the compressor say it is simple?
Because it is: it writes stored and fixed Huffman blocks with a plain longest-match search, which every reader accepts and which a library would beat by a few per cent. Decompression is the whole of the standard, including the dynamic Huffman blocks this one never writes, because a decompressor that only read its own output would be useless on a real file. Brotli is named and refused: its static dictionary alone is larger than most of the applications in this workspace.