TDMS to CSV Converter
Convert NI TDMS files to CSV in your browser — no upload.
Drop a .tdms file here
or
Your file never leaves your browser.
This tool converts NI TDMS measurement files to CSV entirely in your browser: drop a .tdms file, watch the channel tree appear with sample counts and properties, tick the channels you want and download the CSV. Parsing is streamed in 4 MB slices, so the file is never uploaded and never loaded whole.
How it works
A TDMS file is a chain of segments. Each segment starts with a 28-byte lead-in — the TDSm tag, a table-of-contents bitmask, version and two 64-bit lengths — followed by metadata (object paths like /'group'/'channel', raw-data indexes and properties) and then the raw sample bytes, channel-after-channel. Because later segments may reuse the previous segment's raw index, a correct reader tracks object state across the whole chain — this parser does, and it processes bytes incrementally so chunk boundaries can fall anywhere, even mid-value.
Worked example
→ tree: group1 / ch1 (unit=V · gain=1.5), ch2
→ CSV: header “group1/ch1,group1/ch2” + 100 data rows
parser output is byte-for-byte identical whether the file is fed whole or 1 byte at a time (verified in this site's test suite)
Parameters
| Parameter | Value | Notes |
|---|---|---|
| Input | .tdms (TDMS 2.0) | little-endian, non-interleaved |
| Channel dtypes | i8–i64, u8–u64, f32, f64 | |
| Properties | string · numeric · bool · timestamp | |
| Streaming | 4 MB File.slice chunks | no full-file load, no upload |
| Not supported | big-endian · interleaved · DAQmx | explicit error, never silent |
Python equivalent
# The same conversion with the official NI Python package:
# pip install nptdms
from nptdms import TdmsFile
tdms = TdmsFile.read("measurement.tdms")
for group in tdms.groups():
for channel in group.channels():
print(group.name, channel.name, len(channel))
tdms["group1"].as_dataframe().to_csv("measurement.csv")FAQ
▸Is my TDMS file uploaded to a server?
No. The file is read locally with the browser's File API in 4 MB slices and parsed in JavaScript. It never leaves your machine — which also means confidential measurement data stays confidential.
▸How large a file can it handle?
The parser streams the file in slices rather than loading it whole, but decoded channel data does live in browser memory. Files beyond a few hundred MB may hit tab memory limits — a warning appears above 200 MB. For batch or multi-GB conversion, a desktop TDMS Converter app is planned.
▸Which TDMS features are supported?
Standard little-endian segments with non-interleaved raw data and all numeric channel types (i8–i64, u8–u64, f32, f64), plus file/group/channel properties including strings, numerics, booleans and timestamps. Not yet supported: big-endian segments, interleaved data, DAQmx raw scalers and string-typed channel data — those fail with a clear message rather than producing wrong numbers.
▸What does the CSV look like?
One column per selected channel, headed group/channel. Channels of different lengths are padded with empty cells. Values are written in full double precision.
▸Why do my channels show fewer samples than expected?
A TDMS file appends data in segments; an application that crashed mid-write can leave a truncated final segment. The parser keeps every complete value and drops only the incomplete tail, so the sample count reflects what is actually recoverable.