← Juice

Juice CSV

Version 1. Later versions only add columns; they never rename or repurpose one.

Juice’s own file format for moving a log in and out of the app. One flat table, one row per vehicle or record. It opens as one sheet in Numbers, Excel or Google Sheets.

Example

type,vehicle,date,odometer,distance_unit,quantity,quantity_unit,total,unit_price,currency,full,station,title,category,powertrain,battery_capacity
vehicle,Mach-E,,,,,,,,,,,,,ev,91
charge,Mach-E,2025-03-14T19:40-04:00,12480,mi,58.2,kwh,9.31,0.16,USD,1,Home,,,,
expense,Mach-E,2025-04-02,12910,mi,,,49.00,,USD,,,Tire rotation,Service,,

Rules

  • Headers are English and lower-case, exactly as below. Columns may come in any order, and a file only needs the ones it uses. An empty cell means “not set”. Unknown columns are ignored (and listed before you import); a row with an unknown type is skipped.
  • Delimiter and encoding. The delimiter (,, ; or tab) is taken from the header line. A UTF-8 byte-order mark and blank lines before the header are fine. Export writes UTF-8 with a byte-order mark, so Excel reads accents correctly.
  • Cells. Leading and trailing spaces in a cell are ignored. A cell that needs a comma, quote, semicolon, tab or line break is quoted (RFC 4180; a quote inside is doubled: "").
  • Spreadsheet safety. In the free-text columns (vehicle, make, model, plate, vin, station, note, title, category), a value that starts with =, +, -, @, a tab or a carriage return (after any apostrophes) is exported with one leading apostrophe, so a spreadsheet shows it as text instead of running it as a formula. On import one apostrophe in front of such a character is dropped again. A leading apostrophe before anything else ('s-Hertogenbosch) is kept as written.
  • type says what a row is: vehicle, fuel, charge, expense or income.
  • vehicle is the vehicle’s name. It links rows to each other, so give every car its own name.
  • Dates are ISO 8601: 2025-03-14, 2025-03-14 19:40, 2025-03-14T19:40-04:00. A day without a time is read as noon. Times are kept to the second.
  • Numbers use a dot or a comma as the decimal separator (Czech Numbers saves ;-separated files with decimal commas; both read). Don’t group thousands. Odometers may have decimals; they’re rounded to whole kilometres. A fill-up’s or charge’s total and unit_price can’t be negative (0 is fine: free charging); an expense’s or income’s total must be above 0. A value beyond 1,000,000,000 is unreadable. latitude and longitude must be within ±90 and ±180: an out-of-range coordinate is dropped and the row is kept.
  • Units travel on every row, so one file holds several cars in different units. A charge row’s quantity_unit must be kwh (or empty) and a fuel row’s l, gal_us or gal_imp (or empty); any other value skips the row. A row whose energy the vehicle it goes into can’t log (a charge into a combustion car) is skipped too.

Columns

RowsColumnMeaning
alltypevehicle, fuel, charge, expense, income
allvehicleThe vehicle’s name
alldateWhen; required on every row but vehicle
allodometerThe reading; required on fuel and charge rows
alldistance_unitkm (default) or mi
allnoteFree text
fuel, chargequantityLitres, gallons or kWh; required
fuel, chargequantity_unitl (fuel default), gal_us, gal_imp, kwh (charge default)
fuel, chargetotalWhat it cost
fuel, chargeunit_pricePrice per quantity_unit
fuel, chargecurrencyISO 4217 code, e.g. CZK, USD; default: the app’s currency
fuel, chargefull1 (default) or 0
fuel, chargemissed1 if a fill-up before this one wasn’t logged
fuel, chargestationWhere
fuel, chargelatitude, longitudeDecimal degrees
chargeelectric_distanceA hybrid’s distance on battery since the last charge, in distance_unit
expense, incometotalThe amount; required
expense, incometitleWhat it was; default: the category, else “Expense”
expense, incomecategoryBy name; a new one is created
expense, incomecurrencyAs above
vehiclemake, model, year
vehiclepowertrainice, ev or hybrid
vehicletank_capacityIn quantity_unit (default litres)
vehiclebattery_capacitykWh
vehicleplate, vin
vehiclearchived1 for a vehicle out of rotation

A vehicle row is optional. Without one, the vehicle is created with its name, and its powertrain follows its rows: charges only → electric, fuel only → combustion, both → hybrid.

Importing

  • Juice matches a file’s vehicle to one of yours by VIN, then by name. You can change each match before importing, add it as a new vehicle, or skip it.
  • A row Juice already holds is skipped, never merged: the same kind, odometer and day for fill-ups and charges; the same title, amount, day and kind for expenses and income. A row repeated inside the file counts too. Re-importing your own export changes nothing.
  • A row that can’t be read is skipped and listed with its row number; the rest imports.
  • Text is cleaned before it’s stored: control characters and invisible formatting characters are removed (the joiners that emoji and some scripts need are kept). Names and other single-line fields are capped at 200 characters, notes at 2,000.
  • Exchange rates for other currencies are looked up after the import.

Exporting

Garage → Import data → Export all data writes every vehicle (archived ones too), fill-up, charge, expense and income in kilometres, litres and kWh, each in its own currency, with the time and time zone of every record. Receipts, reminders and exchange rates stay on the phone.

  • Every row links to a vehicle by name, so a record with no vehicle (the Expense form allows “None”) can’t be written. The Import data screen says how many were left out.
  • Vehicles that share a name are exported as “Ravka”, “Ravka (2)”, and so on (case-insensitively unique).

Not in the format

IDs (an import always creates new records), exchange rates, receipts, reminders and Toyota links.

Juice · Česky · Privacy · Terms · Cookies · [email protected]