Skip to content

Oximeter file converter

Drop a recording from a Wellue, Contec or ChoiceMMed oximeter, or a CSV from any other app, and save it as a CSV in the ViHealth layout. That is the file the session viewer, compare nights and the app read. The file is read in your browser and never uploaded.

Drop an oximeter file or a CSV here

The file is read in this browser. Nothing is uploaded.

Files this tool reads

  • Wellue / Viatom raw file
  • Contec CMS50 .SpO2 file
  • ChoiceMMed MD300W1 .dat file
  • CSV with your own columns

Keep every night

This tool forgets your file when you close the page. An account keeps every night you load, from any of these oximeters, so you can compare nights and follow your overnight oxygen over weeks and months.

  • Every recording saved and searchable
  • Compare any nights, any time
  • ODI, T90 and CVHR trends over time
  • Tag nights with what you changed
  • See which habits line up with your numbers
  • Describe a night in plain English

Your first 5 nights are free. No card needed.

Supported files

Wellue and Viatom raw files
From the O2Ring, Checkme O2 Max and SleepU, saved by the oximeter data export tool or copied for OSCAR. The file has no extension and is named after the recording start, such as 20260611223127. One sample every 2 seconds.
Contec CMS50 .SpO2 files
Saved by Contec's SpO2 Assistant software for the CMS50D+, CMS50E, CMS50F and CMS50I, and rebadged versions of them. The file holds the start time and the SpO2 and pulse readings. It does not record how often it sampled, so you set that (one per second unless your device says otherwise).
ChoiceMMed MD300W1 .dat files
The MedView .dat file from the ChoiceMMed MD300W1 wrist oximeter, and from tools that write the same layout for OSCAR. Every reading carries its own clock time, so gaps in the night stay where they happened.
Any CSV with time, SpO2 and pulse columns
Exports from other apps and oximeters, comma, semicolon or tab separated. You pick which column is the time, the SpO2 and the pulse, and see the result before you save. Times can be a full date and time, a clock time with the date entered by you, or seconds from the start.

Older Contec .spo and .spoR files from SpO2 Review are not supported: their header layout is not publicly described. If your software can export a CSV instead, use that.

How to convert a file

  1. Drop the file on the box above, or press Choose file.
  2. Check the format the tool picked. For a CSV, check the columns it guessed.
  3. If the file has no start time, enter when the recording began.
  4. Press Save CSV. The file lands in your downloads folder.

What you get

A CSV with the four ViHealth columns: Time, Oxygen Level, Pulse Rate and Motion, one row per sample. The CSV format guide explains each column. Files without a motion reading get 0 in that column.

Each row's time is worked out from its position, so a hole in the recording is filled with rows of 255, the value ViHealth writes when the sensor had no reading. Readings outside 50 to 100% SpO2 or 20 to 250 bpm are written as 255 too. The post on gaps in O2Ring data covers why they happen.

The file is named PulseOx_ followed by the start time as 14 digits, such as PulseOx_20260611223127.csv. The session viewer reads the date from that name, so keep it if you rename the file.

What to do with the CSV

Common questions

Which oximeters does this work with?
Wellue and Viatom recorders (O2Ring, Checkme O2 Max, SleepU) through their raw files, Contec CMS50 models through SpO2 Assistant's .SpO2 files, and the ChoiceMMed MD300W1 through its .dat file. Anything else works if its app can export a CSV with a time, an SpO2 and a pulse column.
My file is not recognised. What now?
Look in the app that came with the oximeter for an export to CSV or Excel. Save an Excel sheet as CSV, then drop that here and pick the columns.
Why are there rows of 255 in my CSV?
They mark time where the file has no usable reading, either because the oximeter recorded nothing then or because the reading was out of range. Keeping those rows keeps every later row at its true clock time.
Will the times shift to my time zone?
No. Oximeter files carry the clock time the device showed, with no time zone, and the CSV keeps that clock time as it is.
Can OSCAR open the converted file?
OSCAR imports some raw device files but not the ViHealth CSV. Keep your original file for OSCAR, and use the CSV for spreadsheets, the session viewer and the app.
Where does my file go?
Nowhere. The page reads it in your browser and writes the CSV straight to your downloads folder. Nothing is sent to a server, and you do not need an account.

Format sources

  1. Apnea Board wiki. Wellue Viatom File Import: the raw file is named after the recording start, YYYYMMDDhhmmss, with no extension. www.apneaboard.com
  2. CPAPtalk forum. "Truncate an SPO2 file" (2015): the Contec .SpO2 layout worked out for SleepyHead, with the start time, the sample count and the SpO2/pulse byte pairs. www.cpaptalk.com
  3. emay2medview (BSD-3-Clause). MedViewFileWriter.py writes the ChoiceMMed MD300W1 .dat layout: a 3-byte header and 11-byte timed records. github.com

Not a medical device. Does not diagnose, treat or prevent any condition. Discuss results and changes with a clinician.

Not a medical device. Does not diagnose, treat or prevent any condition. Discuss results and changes with a clinician.