Logo CFNReader
Provides a simple way to read FNIRSI's CFN files (*.cfn) produced by the FNIRSI UsbMeter tool (here). With this library you can also convert *.cfn files to CSV files easily. Available as NuGet package.
using var myfile = File.OpenRead("myfile.cfn"); var cfnreader = new CFNStreamReader(myfile); // Read general file information var fileinfo = await cfnreader.ReadFileInfoAsync(); // Read and print data points await foreach (var datapoint in cfnreader.ReadDatapointsAsync(fileinfo)) { Console.WriteLine( string.Join("\t", [datapoint.Time.ToString("G"), datapoint.Values[Channel.VBusVoltage], datapoint.Values[Channel.VBusCurrent]]) ); }
Output:
0:00:00:00,0000000 0.0000V 0.0126A 0:00:00:00,0100000 0.0100V 0.0126A 0:00:00:00,0200000 0.0200V 0.0126A 0:00:00:00,0300000 0.0300V 0.0126A 0:00:00:00,0400000 0.0400V 0.0126A ...
The CFNStreamReader class provides two methods to read the file: ReadFileInfoAsync and ReadDatapointsAsync. The first one reads the file header and returns a FileInfo object. The second one reads the data points and returns an IAsyncEnumerable<DataPoint>. Both methods are asynchronous and support cancellation using a CancellationToken.
A simple way to convert the data to a CSV is provided by the CFNCSVConverter:
using var myfile = File.OpenRead("myfile.cfn"); using var csvfile = File.Create("export.csv"); var csvconverter = new CFNCSVConverter(new CFNCSVConverterOptions() { Channels = [Channel.AccumulatedCapacity, Channel.VBusVoltage], Predicate = dp => dp.Values[Channel.VBusVoltage] > 0.5, IncludeUnit = true, LimitDataPoints = 1000 }); await csvconverter.ConvertToCSVAsync(testfile, csvfile);
The CFNCSVConverter class constructor accepts CFNCSVConverterOptions or IOptions<CFNCSVConverterOptions> which has the following properties:
Channels: An array ofChannelvalues to include in the CSV. The order of the channels in the array will be the order of the columns in the CSV.Predicate: A function that receives aDatapointand returns a boolean. If the function returnstrue, theDatapointwill be included in the CSV.FormatProvider: AnIFormatProviderto use when formatting the values.Separator: The separator to use between the values (default;).Encoding: The encoding to use when writing the CSV file (defaultUTF8).TimeFormat: The format to use when formatting the time values (defaultG).ValueFormat: The format to use when formatting the values (defaultN4).IncludeHeader: Wether to include the header row in the CSV.IncludeTime: Wether to include the time column (always first column).IncludeUnit: Wether to include the unit of the value(s) likeA(amps) orV(volts) for example.LimitDataPoints: The maximum number of data points to include in the CSV (defaultint.MaxValue)
This library is based on didim99's work in usbmeter-utils.