FSharp.Data.Tdms
provides support for TDMS 2.0 files[1] from F# and C# on .NET 6.0.
From F# it allows you to access these in a type-safe manner through a generative https://docs.microsoft.com/en-us/dotnet/fsharp/tutorials/type-providers/[type provider], while plain old functions and methods are available to both F# and C#.
FSharp.Data.Tdms
reads raw channel data from TDMS 2.0 files as arrays.
FSharp.Data.Tdms
is licensed under an MIT License.
Please refer to LICENSE
for its full text.
Using the generative type provider, given a TDMS file Experiment.tdms
with a channel containing floating-point values named Channel1
within a group named Group1
:
#r "nuget: FSharp.Data.Tdms"
open FSharp.Data
[<Literal>]
let Path = "Experiment.tdms"
type Experiment = TdmsProvider<Path, WriteIndex = true>
let experiment = Experiment(Path)
experiment.Group1.Channel1.Data |> Array.iter (printfn "%f")
Alternatively, use the functions in the FSharp.Data.Tdms
namespace, mainly those in the File
module:
#r "nuget: FSharp.Data.Tdms"
open FSharp.Data.Tdms
File.read "Experiment.tdms" true
|> File.tryRawData<float> "Group1" "Channel1"
|> Option.defaultValue [||]
|> Array.iter (printfn "%f")
These functions have asynchronous equivalents:
#r "nuget: FSharp.Data.Tdms"
open FSharp.Control.Tasks.NonAffine
open FSharp.Data.Tdms
task {
let! file = File.readAsync "Experiment.tdms" true
let! data = File.tryRawDataAsync<float> "Group1" "Channel1"
Option.defaultValue data
|> Array.iter (printfn "%f")
}
|> Async.AwaitTask
|> Async.RunSynchronously
When using FSharp.Data.Tdms
from C#, prefer the API for idiomatic C#:
|
Or asynchronously:
|
Most TDMS 2.0 data types directly map to .NET 5.0 data types.
The first exception is tdsTypeTimeStamp
, which you can read as either link:FSharp.Data.Tdms/Timestamp.fs[FSharp.Data.Tdms.Timestamp
] (this data type corresponds to https://www.ni.com/nl-be/support/documentation/supplemental/08/labview-timestamp-overview.html[the NI LabVIEW timestamp]), System.DateTime
, System.DateTimeOffset
, or System.TimeSpan
.
In case of System.TimeSpan
, FSharp.Data.Tdms
returns the time elapsed since 01/01/1904 00:00:00.00 UTC
, as per https://www.ni.com/nl-be/support/documentation/supplemental/08/labview-timestamp-overview.html[this support document from NI].
The second exception is tdsTypeExtendedFloat
.
Since .NET 5.0 does not support 80-bit extended precision floating point numbers, FSharp.Data.Tdms
reads these as FSharp.Data.Tdms.Extended
values.
Mapping from TDMS 2.0 to .NET 5.0 data types in FSharp.Data.Tdms
Name |
TDMS 2.0 data type |
.NET 6.0 data type |
F# alias |
C# alias |
---|---|---|---|---|
Void |
|
|
None |
|
8-bit signed integer |
|
|
|
|
16-bit signed integer |
|
|
|
|
32-bit signed integer |
|
|
|
|
64-bit signed integer |
|
|
|
|
8-bit unsigned integer |
|
|
|
|
16-bit unsigned integer |
|
|
|
|
32-bit unsigned integer |
|
|
|
|
64-bit unsigned integer |
|
|
|
|
32-bit single-precision floating point |
|
|
|
|
64-bit double-precision floating point |
|
|
|
|
80-bit extended-precision floating point |
|
|
None |
|
Character string |
|
|
|
|
Boolean |
|
(https://docs.microsoft.com/en-us/dotnet/api/system.boolean?view=net-5.0[`System.Boolean`] |
|
|
Timestamp |
|
|
None |
None |
32-bit single-precision floating point complex |
|
|
|
|
64-bit double-precision floating point complex |
|
None |
None |
Imposter syndrome disclaimer: I want your help. No really, I do.
There might be a little voice inside that tells you you're not ready; that you need to do one more tutorial, or learn another framework, or write a few more blog posts before you can help me with this project.
I assure you, that's not the case.
And you don't just have to write code. You can help out by writing documentation, tests, or even by giving feedback about this work. (And yes, that includes giving feedback about the contribution guidelines.)
Thank you for contributing!
http://www.ni.com/white-paper/3727/en/
.