TestBench.tools

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

file: group1 · 2 channels (f64) · 100 samples each · 2 segments
→ 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

ParameterValueNotes
Input.tdms (TDMS 2.0)little-endian, non-interleaved
Channel dtypesi8–i64, u8–u64, f32, f64
Propertiesstring · numeric · bool · timestamp
Streaming4 MB File.slice chunksno full-file load, no upload
Not supportedbig-endian · interleaved · DAQmxexplicit error, never silent

Python equivalent

Python
# 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.

Related tools