图片缩略图"itemprop=

tdm读者

版本1.13.0.0 (44.9 KB)由 吉姆Hokanson
读取TDMS文件v1和v2没有DLL当前版本:2.5
4.9
60评级

272下载

更新2018年12月20日

查看许可协议

读取TDMS文件到Matlab。

优点:
—支万博1manbetx持读取v2文件
-不需要NI DLL,因此它不需要32位窗口
—支万博1manbetx持数据交叉
-只允许读取名称和属性来快速了解文件中的内容
-允许读取数据的特定子集,以限制内存使用

有关子集检索示例,请参见:
https://gist.github.com/JimHokanson/dfecf21bde0bb7f2484adaf3c646b91a

最简单的用法是:
filestruct = TDMS_readTDMSFile(filename.tdms);

引用作为

吉姆·霍坎森(2020)。tdm读者(//www.tianjin-qmedu.com/matlabcentral/fileexchange/30023-tdms-reader), MATLAB中央文件交换。检索

意见及评分(201

齐夫Arzi

嘿,吉姆,干得好!
我有一个建议,如果nargin==0,你可以使用uigetfile获取文件

例如:
如果nargin == 0
[temp_tdms_filename temp_tdms_path] = uigetfile(“*。tdms','请选择tdms文件');
tdmsFileName = [temp_tdms_path, temp_tdms_filename];
%error('输入到%s需要一个文件名',mfilename)
结束

是的,详情请看这里:
//www.tianjin-qmedu.com/help/compiler_sdk/ml_code/function.html

基本上你只需要删除%#文本。假设你可以添加一个space => % # of bytes…(或者直接删除评论)

Micke表示

我最近开始得到这个错误:
警告:文件:TDMS_preprocessFile。m行:86列:21
无法识别的pragma“%#字节导入”。
TDMS_readTDMSFile中的>(第226行)
在TDMS_getStruct(第57行)

我最近安装了“MATLAB支持MinGW-w64 C/ c万博1manbetx++编译器”,我想知道这是否与它有关。

嗨,克里斯汀,听起来你不是安装有问题就是路径有问题。我很好奇如果在命令窗口中键入path命令会得到什么。为了让事情不那么混乱,你为什么不给我发一封电子邮件,我可以试着帮忙。

嗨,吉姆,谢谢你这么快给我回电话。我已经尝试了你的建议,但最终出现以下错误信息。我试着在Matlab中打开TDMS_getStruct代码,看看我是否可以这样做,但这只会产生另一系列错误消息。我用的是2019a。

>>编辑matlab.internal.math.partialMatchString
使用编辑错误(第66行)
这种类型的变量不支持大括号索引。万博1manbetx

@Christine,错误出现在程序的早期,它试图知道自'who'最后一次调用以来定义了哪些新变量。我现在使用了一种不同的(更好的)方法,但这种方法仍然有效。如果你去到错误的行(通过在命令窗口中键入编辑mat .internal.math. partialmatchstring,我使用2019a),我看到:assert(isstring(options) || ischar(options) || iscellstr(options))这对于'iscellstr'应该是真的-输入是字符串的单元格数组即cellstr。如果你看到同样的东西,我猜你正在用你自己的版本的iscellstr遮蔽iscellstr。-all iscellstr可能指示该代码的位置。看到//www.tianjin-qmedu.com/matlabcentral/answers/418668-digraph-plot-bug-in-2018a对于类似的问题,但使用strncmpi。

你用的是哪个版本的Matlab ?

我从LabView生成的文件中做了很多tdms处理。最近,我们一直在处理来自我们的姐妹公司的文件,他们开发了自己的Labview程序来生成与我们类似的文件。曾经有一段时间,生成这些文件是没有问题的,然而,现在我们每次尝试读取它们的文件时都得到相同的错误。我们检查了他们LabView代码中使用的tdms文件格式的版本,它是2.0版本,我们认为这可能是问题所在,但这是最新的版本。下面是我们接收到的错误:
---------------------------------------------------------------------
使用TDMS_preprocessFile错误(第450行)
剩余的数据没有被分割成块,估计块的数量:5.000000e-01

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});
--------------------------------------------------------------------
如果有人能帮忙,我将不胜感激。excel导入器可以很好地处理文件,我们的替代方法是从excel中读取它,但是我们经常在大型文件中超出excel中的行数限制,必须打开多个excel文件才能传输所有数据。

补充我上次的评论
这些是我得到的错误
使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

Untitled中的错误(第13行)
[final_output(i), Meta_struct(i)] = TDMS_readTDMSFile(文件{i});

嗨,我一直得到下面的错误消息。我不知道我做错了什么。的帮助!先谢谢你。
文件名= 'test.tdms';
my_tdms_struct = TDMS_getStruct(文件名);
使用matlab.internal.math.partialMatchString错误(第10行)
断言失败。
单元格错误/唯一错误(第102行)
foundflag = matlab.internal.math.partialMatchString(flag,flagvals);
cell/setdiff> cellset绕衍射2012a错误(第303行)
uA =唯一的(a,顺序);
cell/setdiff错误(第83行)
[varargout{1:nlhs}] = cellset绕射2012a(varargin{:});
TDMS_readTDMSFile中的错误(第148行)
constantParams = setdiff(who,temp);注意:下面我把这些放在
TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

@Tom,最大的变化是在2008年左右,他们引入了~操作符,以表明输出不应该赋值给变量。在此之前,人们通常会一遍又一遍地使用像“junk”这样的变量,这表明它并没有真正被使用。例如,你可以将“[~,~,fileExt] = fileparts(tdmsFileName);”改为“[junk,junk,fileExt] = fileparts(tdmsFileName);”。只是要注意不要选择一个我用作变量的名称。

你好,先生!我无法通过第一个方格。我的客户给我提供了几个TDMS文件,我试图阅读它们,但我得到的都是
cspd = TDMS_readTDMSFile('current_speed_1.tdms');
???错误:文件:TDMS_readTDMSFile。m行:134列:3
表达式或语句不正确——可能不平衡(、{或[。

我运行的是R2007b,很旧了,而且我有段时间没用过MATLAB了,我在做什么蠢事?Mfile编辑器确实用解析错误标记第134行…

谢谢!

@Paul我以前见过这种情况,如果你使用高级TDMS vis来写文件。如果您没有正确关闭文件,也会发生这种情况。如果是后者,代码中的某些地方可以注释掉,基本上会返回部分读取的文件。你也可以尝试在Labview中整理VI,这可能会清理文件,这样我的代码就可以读取它。

我有一个文件,似乎有一个奇怪的头。你对如何处理这件事有什么建议吗?错误信息如下:

my_tdms_struct = TDMS_getStruct(文件名);
使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

@Akhil我建议尝试使用'TDMS_getStruct',这将以一种更容易使用的方式解析信息。第二个输入(在文件路径之后)接受数字1-4,您可以使用它来选择如何创建结构。如果你仍然遇到问题,请随时跟进。

我想访问TDMS文件的根信息,如标题、作者、组等。我可以在哪里使用readTDMS函数访问这些信息?当使用getall时,该信息不能在FinalOutput或metaStruct中找到。

Ziyad Smoqi

我得到以下错误:

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

@Lekha,看起来你可能编辑了我的内部代码,你不应该这么做。也许是因为它找不到你的文件?如果是这种情况,您可能需要使用绝对文件路径(例如,'C:\my_work\CAN_data.tdms')。请尝试将我的代码更改为原来的样子(如果需要恢复到原来,请考虑重新下载)。当前的错误来自于您在代码的第129行中将文件名指定为变量而不是字符串(即没有单引号)的更改。

我运行了这个简单的代码行:filestruct = TDMS_readTDMSFile('CAN_Data.tdms');

我得到了以下错误:
未定义变量“CAN_Data”或类“CAN_Data.tdms”。

TDMS_readTDMSFile错误(第129行)
如果存在~ (CAN_Data.tdms,“文件”)

Untitled中的错误(第1行)
filestruct = TDMS_readTDMSFile('CAN_Data.tdms');

我还遇到了DAQmx数据格式转换问题,但是NI网站上有一个VI发布,它将DAQmx原始文件转换为标准TDMS文件,然后该文件可以用这个实用程序转换为Matlab。我对两者都心存感激。:)搜索“使用LabVIEW转换TDMS文件与DAQmx原始数据”。

@Jeroen在我写这段代码的时候,我写的是准确性,而不是速度。有时我想回到过去,使它更快,但由于我不再使用这段代码,我没有麻烦-太多其他的事情要做!代码解析头信息的速度相对较慢,如果你使用Labview对其进行碎片整理,阅读速度会快得多。在许多情况下,每当您将数据写入文件时,都会创建一个新的头来描述数据。对文件进行碎片整理将合并所有数据并删除大部分头文件,这将显著加快读取速度。我希望您的索引文件在整理碎片后会大幅缩小(大约几KB)。在我的工作中,我经常会有几GB大小的TDMS文件,可以很好地读取(在几秒钟的顺序)。在Labview中,诀窍是将收集到的数据管道到队列中,然后有一个单独的循环,将队列中的数据以较低的速率写入文件(可能是每秒一次-而不是几毫秒一次)。注意,这是10多年前的事情了,Labview可能有更好的方法来指定写入频率。

嘿,
我有一个大的(1.2GB) TDMS文件,我需要读入matlab。我首先运行你的代码来加载一个测试文件(52MB),我在网上找到了一个完美的测试文件。当尝试使用TDMS_readTDMSFile或TDMS_getStruct函数加载我的文件时,它需要永远的时间(我在2小时后取消了它)。
在尝试了以下方法后,所有这些方法都没有帮助,我认为运行时间过长不是由于文件的大小,而是其他问题:
-在我的数据文件文件夹中有索引文件(49mb)没有帮助。
-我尝试先获取元数据,以便以2种方式读取数据通道:
将GET_DATA_OPTION参数设置为“getnone”
运行TDMS_readChannelOrGroup(文件名,1)
上面两个都需要花费很长时间,我在得到任何输出之前取消了它们(我让它运行的最长时间是30分钟)。

在没有索引文件的情况下,在52MB的测试文件上运行上述任何程序大约需要0.5秒。

你知道哪里出了问题吗?
提前感谢你的帮助

之浩

看起来你在传递字符串'filename'而不是变量filename。要修复此问题,请在函数调用中删除filename周围的单引号。

之浩

嗨,吉姆。
谢谢分享!我尝试读取一个tdms文件(大约800M)。遵循ing is my main code and still some error,could you give me some advice.
clc
清除所有
filename = uigetfile(' amp1v_fre5 .tdms');
% my_tdms_struct = TDMS_getStruct(文件名);
测试= TDMS_readTDMSFile(文件名)
y = test.data
m = y {3};
n = m (1:3 * 2000000);
使用TDMS_readTDMSFile错误(第130行)
指定用于tdms读取的文件不存在,FILENAME: FILENAME

主错误(第5行)
测试= TDMS_readTDMSFile(文件名)

嗨,阿里,请阅读下面关于“原始”数据的其他讨论。这是一个专有的Labview格式,我看不懂。

嗨,吉姆。
谢谢分享!我确实添加了路径中的所有内容,但我在使用时得到以下错误:filestruct = TDMS_readTDMSFile('filename.tdms');

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

任何想法?

最好的

管理

也非常快!

嗨,冬青,

首先需要确保所有函数都在搜索路径上。如果我没记错的话,你需要添加根文件夹和tdms子函数文件夹到你的路径。在Matlab的工具栏Home => Set Path下,您将得到一个GUI,它将帮助您将文件夹添加到路径中。

完成此操作后,最简单的用法是调用:filestruct = TDMS_readTDMSFile('filename.tdms');如果您遇到了特定的问题或错误,请随时在这里发布或给我发电子邮件。

我对Matlab比较陌生,运行这个程序有困难,在运行程序之前,我需要重命名我的文件或者做些什么吗?

Kuenwei吴

谢谢吉姆分享这个包裹。代码运行得很好。

@Ahmed我关于过早结束数据收集的评论仍然有效。如果没有Labview,你很可能需要尝试提前停止读取,只返回整个部分。换句话说,捕捉错误(在读取器代码中)并在此时停止元解析。不幸的是,我现在有点忙,所以我不能自己做这些修改。注意,使用这种方法,您只能获得部分数据,但这通常已经足够了……

@Jim Hokanson我没有使用Labview记录这些文件,我不知道如何做到这一点。我使用STS Live软件。

@Ahmed通常这种情况发生在文件没有被正确关闭时(即程序退出而没有关闭文件)。我认为整理文件-使用Labview -将解决这个问题(尽管最好做备份)。如果你仍然有文件的问题,你可以发送一个例子文件给我,这是不工作的,我可以看看它。

非常好的代码,我在我的博士工作中使用过它。
现在,我得到估计#块错误,我怎么能修复它?

"使用TDMS_preprocessFile时出错(第450行)
剩余的数据不会被分割成块,估计块数量:1.178519e-03"

" TDMS_readTDMSFile中的错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);"

谢谢

非常好用的工具,谢谢你,吉姆。

@doyi joo你看到的是一个单一的错误,即我的代码无法处理原始DAQ MX数据。这是NI尚未发布规格的专有格式。关于此事的其他讨论见下文。如果你想在Matlab中阅读这些文件,我通常建议你在Labview中使用非原始格式来阅读和重写这些文件。

doyi joo

你好,

如何修复这些错误?
使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

NI_data_processing中的错误(第10行)
my_tdms_struct = TDMS_getStruct('600_idle.tdms');

@StoneCold555

这个库的解析性能可以显著提高,特别是在元数据的解析方面。但是,如果对文件进行碎片整理,通常可以显著加快解析速度。我曾经在Labview中这样做,我将加载所有的文件,并通过碎片整理TDMS vi运行它们。这删除了所有的写头,因此基本上你只得到一个头,然后是数据的二进制转储。

@Jim Hokanson,首先感谢你的剧本。
我必须读入数百个TDMS文件,我的问题是处理时间。不管我阅读的TDMS文件是5列还是50列,花费在阅读上的时间几乎是一样的。
有办法改善吗?
谢谢

@Wolfgang_Send谢谢你提到使用示例。使用文档肯定可以改进,尽管我更倾向于重写接口代码!因为我不再使用TDMS文件,所以它的优先级非常低。我已经把你的例子加到描述里了。

@Shen_Chiu我更新了描述,提供了一个链接到一个要点,显示如何只检索部分数据。它包含一个到示例TDMS文件的链接,您可以使用该文件来运行示例。就像太多的代码一样,所有这些都是在匆忙中创建的,选项界面非常尴尬。为了更具体地解决您的问题,所有tdms数据都存储在父组的一部分通道中。数据数组由它们的组和通道唯一标识。例如,您可能有“Electrode1”、“Electrode2”等组,然后每个组都可能有一个“Channel1”通道。您的具体示例位于底部,尽管它需要定义'm',它在文件中稍高一些。

沈赵

嗨,吉姆,你能否提供一些例子,说明如何读取数据的特定子集。仍然不清楚如何从TDMS_retrievingSubsets.m中提供的示例检索数据子集。我搞不清楚这些myGroup和myChannel是什么。

Wentao赵

致可能难以读取TDMS文件(NI)的所有用户。我最近下载的2.5版本非常简单高效。只需在包含上述文件的目录中根据需要编写MATLAB文件即可。所需要的第一行代码是:>filestruct = TDMS_readTDMSFile(filename.tdms);变量filestruct由12个字段组成,其中包含所有数据(包括原始数据)。就是这样。你,吉姆,知道这一点——多亏了你的工作!这条评论针对的是像我这样的用户,他们最初对示例文件和其他永远不需要阅读的文件感到困惑。MATLAB变量结构表告诉你所有你需要的信息和在哪里找到。一揽子计划兑现了它的承诺。

@Kah Boon Ho,
表名不是有效的可选输入。TDMS_retrievingSubsets指定大多数有用的有效可选输入,因此类似这样的东西可能工作(未测试)
Og = struct;噩。fullPathsKeep = [];噩。groupsKeep = {'Sheet2','Sheet4'};[finalOutput,metaStruct] = TDMS_readTDMSFile('filename.tdms','GET_DATA_OPTION',' get子集','OBJECTS_GET',og)

@Jim,

在使用getStruct函数进行数据转换时,我注意到一个奇怪的问题。这似乎是价值观的不同。当我在excel tdms查看器中打开数据并将数据与matlab数据进行比较时,值存在差异。

贾文浩

@Jim
请问我如何从tdms文件中读取具体的表格?我尝试[finalOutput,metaStruct] = TDMS_readTDMSFile('filename.tdms','Sheet2','Sheet4'),它仍然是提取表1数据。

@Marc

我不确定我是否遵循....你是否读到了时间信号给出了非等间距点?换句话说,如果你在数值数组上调用类似plot(data)的东西,这些点将总是等距的,因为x值只是样本数....请随意发给我一个示例文件或澄清,因为我不确定我是否理解

Marc Rico

感谢吉姆创造了这个不错的工具。

当我用TDMS_readTDMSFile函数读取我的文件* .tdms时,我有一个问题/问题。如果我用点格式表示导入的数据,它们看起来好像是等距分布的,即y轴上的“线”。但是,如果我使用LabView将*tdms文件转换为*txt,则不会发生这种情况。你知道会发生什么吗?我错过了什么?

再次感谢您提供这个工具

杰森刘

@Andy

首先想到的是,这听起来像是数据形状的问题(即行和列的#)。如果不是,这可能也是一个数据类型的问题(即单对双),尽管我希望大多数Matlab的过滤器转换为双计算,但也许不是?如果你给我一个示例文件和示例代码,我很高兴看到它。

吉姆,谢谢你创造了这样一个有用的工具。我有一个问题,希望确定我在过滤数据时得到的奇怪结果的来源,数据被读入Matlab。在使用TDMS阅读器将数据读入Matlab后,我尝试对数据应用高阶切比雪夫滤波器,结果得到一个渐近上升的信号。但是,如果我将tdms文件中的数据复制到一个文本文件中,将文本文件中的数据上传到Matlab,并使用相同的过滤器处理数据,我就可以使过滤器充分地执行。我是否遗漏了使用TDMS Reader读入Matlab的数据格式。我欣赏任何见解,因为我对过滤结果中的差异感到疯狂。干杯! !

@Ahmed,

我认为这通常发生在使用“高级TDMS”编写vi时,它绕过了一些正常的文件布局要求。或者,如果写作被打断,我也能看到这种情况发生。我猜如果您使用了高级调色板中的任何一个VIs,您就会知道。一种可能的解决方法是在错误发生后停止读取文件。如果你和我取得联系,你可以发给我一份文件看。

我尝试使用阅读器,但我得到以下错误

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块数量:3.907886e-03

TDMS_readTDMSFile错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人知道原因吗?

谢谢,我让NI用户改为导出到TDMS。简单的解决方案。

@Richard

TDMS和TDM是非常不同的文件格式。此代码不支持TDM。万博1manbetx对于通用阅读器来说,最好的选择是使用以下方法将TDM文件转换为TDMS:
http://zone.ni.com/reference/en-XX/help/371361H-01/glang/convert_to_tdm_tdms/
文件格式为:
http://zone.ni.com/reference/en-XX/help/370858N-01/tdmdatamodel/tdmdatamodel/tdm_fileformat/

创建一个基本的阅读器应该很容易,因为它的格式本质上是xml和二进制数据转储。随时给我发信息,我们可以谈谈你需要写大约10 - 15行代码来获得你想要的数据。

嗨,吉姆,这段代码是否处理tdm数据结构(即.tdm定义和.tdx数据文件)?如果没有,有什么建议吗?
谢谢

@Kathrin还有其他一些想法。首先,Matlab并不总是很好地处理文件名编码。如果你的文件名(或路径)不是ASCII码,你可能会遇到问题(见Kostyantyn 2017年11月的帖子)。您可能还会遇到tdms索引文件的问题,但我不确定具体是什么问题。

如果在TDMS_preprocessFile中初始化输出之前将下面的代码输出放在右边(大约在第136行左右),那么了解下面的代码输出可能会有所帮助
disp (isIndexFID)
disp (tdmsFileName)

如果你给我发消息,我也很乐意私下协调调试,直到达成解决方案,我可以与他人分享。

谢谢你吉姆。路径是正确的,正如其他人已经描述的那样,fid是正常的,直到出现错误消息,它们突然变为-1。数据是正确的,当从smetc读取基于labview的程序时,我可以看到数据头,但在保存到变量之前会遇到错误。上周我尝试了很多,改变了文件,等等,没有机会让它运行。进一步推荐:我只是给文件夹与tdms文件....用正确的路径。代码读取单个文件:为什么有一个文件,它被打开,然后读取失败?结构改变了吗?非常感谢你的帮助!

@Kathrin这种消息通常表明文件没有被正确打开,通常是因为它不存在。我面前没有代码,理想情况下,我应该检查fid是否有效,但要确保文件路径正确。请注意,相对文件路径很可能不受支持,您需要指定文件的完整路径。万博1manbetx

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人知道我在哪里可以找到它的解或描述吗?

我偶尔会看到没有正确关闭的文件。你可以通过在TDMS_preprocessFile中第179行左右添加以下代码来选择忽略这些错误:

处理含铅量百分比
%======================================================================
试一试
[flags,info] = TDMS_processLeadIn(fid,lastLetter);
抓住我
nSegs = nSegs - 1;
打破;
结束

此外,有些文件加载非常慢,不是因为文件大小,而是因为样例一次写入一个到磁盘。如果你能运行TDMS碎片整理。vi对文件(使用Labview),它将删除很多不必要的开销和加快读取文件。修改vis时请小心,并考虑在文件副本上运行碎片整理。举个例子,我刚刚处理的一个文件最初加载大约需要30秒,而在对其进行碎片整理后需要0.16秒。

不确定原因,但每次我试图读取名为“Aufnahme 13”的文件时都会发生错误。tdms”(在德语中是测量13的意思)
#使用TDMS_readFileHelper_v1错误(第184行)
#检测到灾难性错误,代码可能在某个地方有错误
重命名这样的文件可以解决问题。

@Brandon -时间应该作为Matlab数据enum值,这样在值上调用datestr()应该显示日期。但你的价值并没有太大意义。我不太确定您所说的“绝对时间”TDMS文件是什么意思。另外,我很好奇您是否正在读取以其他方式保存的时间戳或数据,可能带有指示开始时间的属性。请随意发给我一个样本文件,我可以看看。

不确定是否会看到这个问题,但是——时间是如何格式化的?在一些绝对时间TDMS文件上运行MacOS Matlab 2016a。时间的输出在70000秒范围内。起初,我假设是UNIX纪元,但是70,000相当于8天的秒。此外,30秒在这些单位中约为。00034。我忽略了什么显而易见的东西?

谢谢,
布兰登

本贾

非常好

你好吉姆,

在运行TDMS_exampleFunctionCalls从.tdms文件中提取数据时,我遇到了与Henrik在2013年10月的帖子中相同的问题:

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_exampleFunctionCalls中的错误(第36行)
tempOutput = TDMS_readTDMSFile(filePath,params{:});

因为我没有看到任何关于这个话题的答案,所以我转发了这个话题。你知道发生了什么吗?

“fid”在第一次调用预处理函数且没有发生错误时等于3。当错误发生时,“fid”等于-1(我不理解)。

所选路径指向一个只包含一个.tdms文件的文件夹。

非常感谢,

巴普蒂斯特

大家好。我需要你们帮个小忙。我需要一个matlab代码转换一堆TDMS格式文件在excel格式文件。在每个tdms文件中,我有20000行和2列的值。

问题是我有大约150个tdms文件,所有的文件都需要一次转换。

请帮我做这件事。我已经尝试了几个月了,但我不能。我将等待您的回复。谢谢大家。

Alex5

你好吉姆,

首先,非常感谢您创建这些有用函数的所有工作。

我有问题使用readTDMSFile为使用NI的高级TDMS VIs创建的TDMS文件。

使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[旗帜,信息,eof_error] =
TDMS_processLeadIn (fid, lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct =
TDMS_preprocessFile (fid, tdmsFileName paramsStruct);

我创建了一个小的LabVIEW测试程序。对于使用TDMS Open > TDMS Write(写入6个U16值的数组)> TDMS Close生成的TDMS,我没有得到错误。
但是,如果我使用高级功能TDMS高级打开> TDMS设置通道信息> TDMS高级同步写> TDMS高级关闭,那么我就会得到上面的错误。

我编辑了你的函数,这样lastLetter和mtag的值将被打印出来,奇怪的是,mtag在错误消息之前被打印在命令行中两次(见下文)。
对于使用非高级函数生成的TDMS,不会出现这种情况。根据我对代码的理解,第二个值mtag = 0可能是导致错误的原因。

temp = TDMS_readTDMSFile(fullfile(testDirectory,fileNames{iFile}))

lastLetter =

109

mtag =

109

mtag =

0

请帮助!

谢谢

Alex5

@Jessica

我已经很多年没有看过了,我也不再经常使用TDMS了。我能够使用一个玩具示例获得一个解析器。我认为数据通道只是包含原始的DAQ数据,在我的情况下,一个16位整数,然后需要根据与通道相关的属性进行缩放(缩放和偏移量)。我似乎记得在读取实际数据之前还需要跳过大量字节。我可以通过输入一个已知的信号,然后将奇数或偶数的起始字节集转换为int16并绘图来告诉它。例句:

%可能需要在结尾删除一个字节,以便拥有偶数个字节
定型(数据(1:结束),“int16”)
定型(数据(2:结束),“int16”)

最好的方法是在Labview中转换数据。看到的:
https://decibel.ni.com/content/docs/DOC-32817

抱歉我帮不了你。
祝你好运。
吉姆

你好再次,

对于任何人试图读取原始DAQmx数据,这个快速LabVIEW转换器(https://decibel.ni.com/content/docs/DOC-32817)结合吉姆的TDMS阅读器对我来说工作得非常好。

编辑:谢谢你,吉姆!我应该刷新页面的!现在我知道我只得到一条评论。

欢呼,
Jes

你好斯蒂芬,

您需要将TDMS_readTDMSFile中的MACHINE_FORMAT更改为所需的值。如果您希望能够在代码中来回切换,而不让它变得很硬,那么您需要将赋值行向下移动,例如,移到UTC_DIFF行之后。然后,您可以将该值作为选项传递给TDMS_readTDMSFile或TDMS_getStruct作为第三个输入,例如TDMS_getStruct(file_path,[],{'MACHINE_FORMAT','b'})

吉姆

斯蒂芬,他

嗨,吉姆,

我想使用你的功能。但是现在我遇到了麻烦,因为我的数据是大端格式的。你知道怎么把文件转换成小端序格式吗?

最好的问候,
斯蒂芬

杰里米

你好马库斯,

很抱歉耽搁了。还有一个bug,我知道它不是正式规范的一部分,但偶尔会在用户中出现。幸运的是,它会导致一个显式的错误,所以我并没有真的试图太努力去修复它,特别是当我联系NI的时候,他们不知道发生了什么。你的问题可能是这个bug,也可能是别的什么。一个通用的解决方案是使用Labview对文件进行碎片整理,这往往会删除奇怪的边缘情况,也会使读取速度更快。如果你仍然有问题,你可以发给我一个示例文件,我会看看它。

吉姆

你好吉姆,

首先,我非常感谢您为TDMS文件导入所做的工作。代码很棒,适用于许多文件。

不幸的是,我有一些文件的问题:

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块数量:2.439024e-002

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

TDMS_IMPORT错误(第34行)
Assignmentfile = TDMS_getStruct (mstDir.name);

我在评论中看到,这个话题已经有人问过了。所以也许这个问题已经解决了,或者至少你对根本原因有了一个想法,但它看起来像你通过电子邮件回答的。你能分享一下答案吗?

非常感谢!

马库斯

我必须编辑TDMS_dataToGroupChanStruct_v4的第52行。让脚本为我工作。我插入了一个genvarname()调用,即。

groupStruct。(genvarname (TDMS_genvarname2 (chanStruct.name,……
REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND)) = chanStruct;

背后的原因是,提供的TDMS_genvarname2()函数不会生成MATLAB变量名,以防它们包含变音。
TDMS_genvarname2使用isstrprop检查字符串是否为字母数字,但是变音符是字母数字,即使它们不能包含在变量名中:
Isstrprop ('"(Üüß','alphanum') == [0 0 1 1 1]

(我不想改变TDMS_genvarname2本身,因为我害怕副作用——这就是为什么我修改了TDMS_dataToGroupChanStruct_v4。i’我在我当地的TDMS阅读器。)

吉姆,非常感谢你的软件!

吉姆,

谢谢你的回复。这些文件是由一个自主的数据记录器VI编写的。我将看看我是否可以从这一端解决这个问题,因为我们目前正在从一个非常高的级别处理tdms文件。还有很多选项/参数我们还没有探索。谢谢你对可能原因的解释,它给了我很多工作要做。

埃文

你好伊万,

我所知道的错误是:1)在极少数情况下,在标题中有一个我不完全理解的优化,即使在联系NI之后。幸运的是,这是一个显式错误(尽管我认为它会出现在“块”计算部分),而不是一个无声的错误,在这个错误中,您认为一切都好,而实际上并非如此。如果您在tdms文件上运行defragmention vi,则此错误将被修复。2) Labview最近开放了直接写入文件的某些参数的能力(我认为在“高级”tdms部分)。如果你写错了(例如,你写了10个字节的数据,而实际上只写了5个字节),就会导致问题。3)如果你没有正确地关闭文件,有一个脏位,应该抛出一个错误(即,我认为它得到了坏的最初,并设置为好时,一个段被正确地写入)。然而,这会抛出一个不同的错误。

您看到的特定错误基本上是一组4个字节,应该在每个段的开头。如果我没有看到这些字节,那么不知何故,代码没有读取它应该在哪里。我可以对规范中有些多余的东西进行很多其他检查,但这个错误基本上是说我不知道哪里出了问题。您非常欢迎向我发送文件(通常通过链接下载),导致这个问题,我将看看我是否可以以某种方式更新代码。

吉姆

这段代码很棒,在我运行过的99.9%的文件中都运行良好。我偶尔会遇到一个文件,它会返回一个错误-“使用TDMS_readFileHelper_v1的错误(第184行)检测到灾难性错误,代码可能在某个地方有错误”

TDMS_readFileHelper_v1(如下所示)中的179-185行测试什么?在抛出错误的文件上是否缺少一些标准的.tdms头信息?

Ttag = fread(fid,1,'uint8')
Dtag = fread(fid,1,'uint8')
Stag = fread(fid,1,'uint8')
Mtag = fread(fid,1,'uint8')
if ~(Ttag == 84 && Dtag == 68 && Stag == 83 && mtag == 109)
错误('检测到灾难性错误,代码可能在某处有错误')
结束

@spoon,

抱歉,我没有对应的代码。由于元数据是xml格式的,而不是二进制格式的,因此提取所需信息可能会更容易一些。

吉姆

勺子

嗨,吉姆。
在TDMS的地方,我有tdm和tdx测量数据,我需要将其转换为.mat格式。

如果您对此有一个代码,将会有很大的帮助。

嗨,杰夫,

你能先在Labview中整理一下文件吗?如果还不行,请给我发一个例子,我来看看。

吉姆

杰夫

嗨,吉姆,

我已经成功地使用你的代码一段时间了,但它现在给我一个错误,我以前没有见过。

使用TDMS_readFileHelper_v1错误(第188行)
检测到灾难性错误,代码可能有错误
的某个地方

TDMS_readTDMSFile错误(第252行)
data =
TDMS_readFileHelper_v1(支撑材、optionStruct metaStruct paramsStruct);

TDMS_getStruct中的错误(第57行)
(临时metaStruct] =
TDMS_readTDMSFile (filePath readOptions {:});

这可能是由于tdms文件有大量的组,还是我还遗漏了什么?

谢谢!
杰夫

Stefan

嗨,吉姆,
我也有'意想不到的头'错误,但当我尝试修复你提到:
“这个问题可以通过替换你所看到的错误来解决:
Flags = [];
Info = [];
Eof_error = true;
回来,“

我得到一个错误:
警告:文件未正确关闭。
文件末尾的数据很可能会丢失
在赋值A(:) = B中,A和B中的元素数量必须相同。

TDMS_readFileHelper_v1中的错误(第148行)
数据{I_object} (startI: endI) =
从文件中读(支撑材、numValuesAvailable precisionType{数据类型});

TDMS_readTDMSFile错误(第252行)
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

任何想法?
Stefan

@Benoit

我不知道是什么导致了你提到的问题。你能给我一个有这个问题的例子文件吗?我会发私信告诉你更多细节。

吉姆

Benoit

嗨,吉姆,

谢谢你的工作。
我尝试使用您的代码,我没有任何错误,但我得到的文件是空的。我的原始文件是70Mo,最终文件只有10Mo。
你有什么线索能帮我吗?
非常感谢。

Benoit

@David

我真的很想改变这个界面:/

问题是输入应该是一个包含字符串的数组结构。

getStruct。Group = '6120';
getStruct。channel = 'Untitled 3';

如果你需要更多帮助,请随时发邮件给我。

吉姆

吉姆,

早在2014年2月22日,Joe Cuschieri有一个关于使用你的函数读取数据段的问题。我得到了相同的误差。你有没有给他一个解决方案或者一些简单读取数据段的示例代码。

谢谢你,戴夫

伟大的代码,第一次工作,只是它应该!

@Joe,

国家仪器公司不会公布他们daqmx格式的规格(我已经问过了),所以我不知道他们的二进制数据意味着什么。他们最近更新了他们的dll,以支持读取版本2的文件,所以你可能会幸运地万博1manbetx使用它。我一直想看看dll,但它在我的优先级列表中真的很低。

到dll的链接可以在这个页面找到:
http://digital.ni.com/public.nsf/allkb/A3663DE39D6A2C5A86257204005C11CA

曾经有一个特定的页面用于dll(它说它只支持版本1,然后最近版本2),但我再也找不到它了。万博1manbetx

祝你好运,如果你还有任何问题,请随时给我发邮件。

吉姆

你好,

当我尝试使用TDMS_readTDMSFile时,我得到一个奇怪的错误:

它告诉我:
"使用TDMS_processLeadIn出错(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);"

该程序是否适合处理原始DAQmx数据?如何避免这种错误?

@Bob,

很抱歉出现了这样的错误信息。在我正在开发的新版本中,我希望提供关于每个错误消息实际含义的冗长文档的链接。tdms文件的每个部分都以字符tdsm(数据文件)或tdsh(如果它是索引文件)开始。如果这些不存在,则表明在解析文件或写入文件时出错。我认为每次我看到这个错误,问题是文件没有正确关闭(在Labview中使用tdms关闭),最后一段已损坏。

这个问题可以通过替换你所看到的错误来解决:
Flags = [];
Info = [];
Eof_error = true;
返回;

如果您还有任何问题,请随时通过电子邮件与我联系。

吉姆

鲍勃

我正试图帮助一位同事解码一条消息,他正在阅读我正在创建的tdms文件。我们读了很多文件,偶尔会看到以下格式的错误:

获取TDMS struct错误:2013-10-17 16_50_15_902.tdms
带有属性的MException:

标识符:“
消息:'头中的意外引导'
原因:{0x1 cell}
堆栈:[6x1 struct]

是否有任何东西可以解释这个错误的含义,以便我可以纠正它?

谢谢!

@Kadir,

请通过电子邮件与我联系,或者向NI投诉。

吉姆

Kadir也

@吉姆,

非常感谢你的澄清。我没有Excel。我尝试了dll,但它只需要样本的前1000个值。因此,我倾向于第三种选择。

你说的“正则数组”是什么意思,我如何进行这种转换?

再次感谢,卡迪尔

@Kadir,

该标志在每个段上更新,并且在整个文件中不是恒定的。这种类型的数据的格式不是由NI指定的,即使在我请求它之后。备选方案包括:
-试用Excel TDMS阅读器
-尝试他们的新dll代码,可能支持原始DaqMX代码万博1manbetx
-将Labview中的数据从Raw DaqMx转换为常规数组,然后使用我的代码

如果你还有任何问题,请随时给我发电子邮件。

吉姆

Kadir也

你好,

我得到了错误“当前代码无法忽略/处理原始Daq MX数据”。然后,我查看了TDMS_processLeadIn,第49-51行:

如果flags.hasRawDaqMX
错误('当前代码无法忽略/处理原始Daq MX数据')
结束

然后,我检查了“flags”结构的“hasRawDaqMX”字段的值。结果是0。那么,我就不会得到在第50行实现的错误,对吧?

有人知道这是怎么回事吗?

提前谢谢你,卡迪尔

哈利

@Jim

非常适合我!太棒了!

非常非常感谢!!!!!

@Harry,

您还需要将tdmsSubfunctions文件夹添加到路径中。我最初把它们放在一个单独的文件夹中,以便更明显地显示哪些函数可以调用,哪些函数不可以调用。很抱歉造成了混乱。

吉姆

哈利

嘿,吉姆,

我对你的代码有问题。
如果我想转换一个.tdms文件,我总是收到错误。

例如:
>> filename = 'C:\Users\*****\Desktop\v2p5\tdms\Messdaten.tdms';
my_tdms_struct = TDMS_getStruct(文件名);
未定义函数'TDMS_handleGetDataOption'用于类型为'struct'的输入参数。

TDMS_readTDMSFile错误(第216行)
TDMS_handleGetDataOption(“检查”,paramsStruct)

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

你能解释一下,有什么问题吗?

你好,

我最近在我的代码中遇到了一个错误,我预计它会影响很少人,但对大多数人来说,它很可能会抛出以下错误:“剩余的数据没有被分割成块。”话虽如此,这是一个bug,我会尽快修复。据我所知,如果偶尔决定不写入一组通道的子集,而在其他时候写入整个组,则会导致问题。喜欢的东西:

如果case1
通道= 1:3
其他的
通道= [1 3]
结束

在我看来,这个错误实际上违背了NI文档,所以我需要联系他们澄清。

详情如下。

非常感谢Junghwan Kim给我发送了一个示例文件,让我最终理解了这个问题。

吉姆

嗨!

在您的示例文件“TDMS_exampleFunctionCalls”中运行步骤2、3和4时,我得到以下错误。
你能帮帮我吗?

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

致以最亲切的问候
亨瑞克

@Navid,

鉴于NI不会发布RawDaqMX数据的数据格式规范,您的选择如下:
1)告诉NI你想要发布规格
2)参考答案:
3)试试这个:
http://www.ni.com/white-paper/4906/en

祝你好运

Navid

亲爱的吉姆,
谢谢你的快速回答,
你对错误代码的看法是正确的,但在使用你的代码后,我得到了与陪审团和简相同的错误,不幸的是,我无法重新保存数据,有其他方法来解决这个问题吗?!

多谢. .

@Navid,

看起来你可能使用了不同的代码:
//www.tianjin-qmedu.com/matlabcentral/fileexchange/28771-converttdms-v9

我建议您改用我的代码。如果你还有问题请告诉我。

吉姆

Navid

亲爱的吉姆,
首先非常感谢你的代码,我有一些TDMS文件的问题,你能帮助我吗?!我明白了:
将“ADC_20130808_165723.tdms”……未定义的函数或变量'TDMSFileNameShort'。

convertTDMS>getSegInfo错误(第405行)
e = errordlg (sprintf ([' Seqment %。0f within ''%s'' has interleaved data which is not
万博1manbetx支持这个'…

convertTDMS中的错误(第276行)
[SegInfo, NumOfSeg] = getSegInfo (fid);

Junghwan

嗨,吉姆,

首先,我非常感谢您的代码。

我得到了和罗伯特和菲奥娜一样的错误。
看起来你通过邮件回复了菲奥娜。你能和菲奥娜分享一下你的答案吗?

很多谢谢!

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计#
块:5.000000e-01

TDMS_readTDMSFile错误(第226行)
metaStruct =
TDMS_preprocessFile (fid, tdmsFileName paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

CLF

@Jane

简短的回答是,没有解决方案。原始Daq MX数据的格式是专有的,NI拒绝了我的文档要求。

如果你仍然想使用我的代码,最简单的方法是使用Labview读取数据文件,并重新保存不使用Raw Daq MX的数据。

你好!

我和陪审团犯了同样的错误。你能发布一个解决方案吗?

干杯!

@Jury

关于这个问题,请发邮件给我。

陪审团

嗨!

我尝试读取TDMS文件,在Matlab R2013a中创建LV2012 (12.0.1f2), 64bit,得到错误:

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

对于读取TDMS文件有什么建议吗?

陪审团

@Cole ? ?-什么解决办法?请通过电子邮件与我联系,讨论细节。

谢谢,
吉姆

我还应该提一下,我确实尝试过你之前给出的解决方案。当我使用它时,我得到以下错误,

---------
TDMS_processLeadIn中的错误(第27行)
Ttag = fread(fid,1,'uint8');

输出参数“eof_error”(可能还有其他)在调用“E:\Data\Cobra Integration”时未分配
测试\ v2p5 \ tdmsSubfunctions \ TDMS_processLeadIn.m > TDMS_processLeadIn”。

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

测试中的错误(第4行)
my_tdms_struct = TDMS_getStruct(文件名);

塔尔·

在Matlab 2010上工作得很好,现在尝试使用Matlab 2008。

得到这个错误:
“? ?错误:文件:TDMS_readTDMSFile。m线:134
列:3
表达或陈述是不正确的——有可能
不平衡(,{,或[。"

我怎么解决这个问题?

仙露,

请将tdmsSubfunctions目录添加到您的路径中。

吉姆

仙露

当我试图读取tdms文件时,我得到以下错误:

???未定义的函数或方法'TDMS_handleGetDataOption'用于输入
struct类型的参数。

错误==> TDMS_readTDMSFile在216
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

我怎么解决这个问题?
谢谢!

罗伯特。

我试图使用文件转换tdms文件,但我有以下错误:

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块的数量:8.181818e-01

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人能帮我解决一下吗?
谢谢

我正在使用您发布在MATLAB Central上的算法从TDMS文件中读取数据,但是我得到了一个错误,我不太明白为什么。

这是我的代码的一部分:
getStruct = struct;
getStruct。Group = {'6120'};
getStruct。channel = {'Untitled 3'};
getStruct。指数= [2 3];
tempOutput4 = TDMS_readTDMSFile(fname,' get_indexes ',getStruct,'SUBSET_IS_LENGTH',false)

然而,我得到这些错误:
使用cell/ismember>cellismemberlegacy错误(第132行)
类cell的输入A和类cell的输入B必须是字符串的单元格数组,
除非一个是字符串。

cell/ismember错误(第76行)
[varargout{1:nlhs}] = cellismemberlegacy(varargin{:});

TDMS_handleGetDataOption错误(第167行)
[~,loc] = ismember(objPaths_getIndex,objectPaths);

TDMS_readTDMSFile错误(第228行)
optionStruct = TDMS_handleGetDataOption(' getray ',paramsStruct,metaStruct);%的选择
处理

Test1中的错误(第21行)
tempOutput4 =
getStruct TDMS_readTDMSFile(帧,‘GET_INDICES’,‘SUBSET_IS_LENGTH’,假)

我使用的是MATLAB R2012b。

有什么建议吗?

雷内,

TDMS不包含时间,除非显式地将其保存为通道。这通常只在周期性采样时才会做,这样事件之间的时间间隔就不是恒定的。否则,时间通常是由已知的采样率暗示的。如果您将时间保存为时间戳,我目前将时间戳数组返回为Matlab时间格式的数字向量,而不是将每个元素转换为字符串(如datestr)。这使得计算时间变得更容易(注意,这个向量中1的差值表示1天的差值,除以86400得到秒)。如果您还有问题,请通过电子邮件与我联系。

吉姆

吉姆,

非常喜欢你的作品。这将节省大量磁盘空间,因为不再需要将其保存为lvm。

输出格式非常简单,但是我不知道哪个变量包含有采样时间的数组。
我认为tdms文件必须保存时间,因为excel可以从那里抓取它。

请问样本时间是否也导入到了matlab中?

最好的问候,
刘若英

嗨,安东尼,

是的,这个问题解决了。我倾向于离线发送邮件。

这是我发给凯文的邮件。如果你还需要什么,请告诉我:

电邮给kevin:
给你数据的人很可能没有正确地关闭文件。此外,他们写文件的效率非常低。

一般来说,每次写入文件时都会创建一个额外的索引头。在一个文件中写入100k个值比写入1个值更有效,100k次,100k个头。在这种情况下,NAV信息被写在一个样本中,然后TANDEM被写在200个样本中。将这些文件写入内存中的某个队列,然后偶尔将它们转储到文件中会更有效。

也就是说,你可以读取你的文件的一部分,如果你改变以下:
假设你没有在阅读:
- TDMS_readFileHelper_v1 -注释掉第187行附近的if eofPosition ~= ftell(fid)
—在TDMS_processLeadIn -第34行左右,注释掉错误并添加以下内容:
Flags = [];
Info = [];
返回
—在TDMS_preprocessFile -大约180行,写以下内容:
如果isempty(旗帜)
nSegs = nSegs - 1;
打破
结束

从本质上讲,你只是在遇到错误时停止代码,只返回到那一刻为止的内容。你文件里的内容已经很多了。我猜你只是在最后遗漏了一点数据,但我还没有费心去检查……

其他一些人也有类似的错误,但在标题中有一个标志,专门用于过早结束。这是我第一次看到标题本身像这样损坏。也许这是因为使用的是tdms文件而不是索引文件。

祝你好运,让我知道这些改变是否对你有用。

安东尼

吉姆,

有办法解决凯文的错误吗?当我运行Matlab代码时,我似乎得到了同样的错误。

伤害

@uwe:我在64bit Matlab (linux和win64)上使用过这个函数,没有任何问题。

乌维Lelke

我还可以用64位Matlab读取简单的tdm文件吗?

法尔汉:抱歉回复晚了。我正在为一个会议做准备,我有点急着把事情做完。我很高兴你把事情搞定了。我将为您的错误添加一个检查,以便其他人得到更明显的错误消息。谢谢!

凯文:文件大小应该不是问题。事实上,我编写的代码专门支持非常大的文件,您可以在读取更多数据之前进行部分读取和处万博1manbetx理。请参阅我的私人信息,了解我们如何能够解决您的问题。

法尔

吉姆,
我解决了这个问题,有一些空的组名,我们的LabView代码忘记分配。我们在LabView代码中修正了这个问题,现在TDMS漂亮地转换成一个数据结构。
谢谢你!

凯文

非常感谢这项工作,这是伟大的,但我有一个问题,当我试图读取一个更大的文件:几MB工作得很好,但与80 MB的文件,我得到这个错误:

???错误使用==> TDMS_processLeadIn在33
头球意外领先

错误==> TDMS_preprocessFile在179
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在226
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

不管怎样,它对较小的文件工作得很好。

法尔

吉姆,
我成功地在我们的TDMS的旧版本中使用了您的代码,但现在我得到一个错误。该文件是完整的,因为它可以在Excel阅读器中打开。

> > TDMS_readTDMSFile(“log_2012 - 10 - 08 - _10 - 53 - 27. - tdm的)
???对矩形空矩阵的不正确赋值。

错误==> TDMS_readTDMSFile在275
groupIndices(curGroupCount) = I_groupObject;

任何帮助都将不胜感激!

吉姆,我真的很欣赏你的工作。它帮了我一个大忙!!

马歇尔

拉里

这密码是上帝派给我的。写得很好,记录得很好,功能强大,效率高。非常感谢你为公众做的贡献,吉姆。

Dedric Xu最近报告说观察到一个代码问题,结果是一个bug。如果我真的认真思考,我说服自己有可能让他观察到的错误发生而没有任何明显的代码失败。我建议在可能的时候将代码更新到V2.5(一旦发布)。这个错误来自于对NI文档的过于字面化的解释。他们已经承认文件措辞不当,并表示将对其进行更新。我向受此影响的其他人道歉,尽管我真诚地希望基本上没有人受此影响。

更多细节可以在版本信息文件中找到。

虽然我目前正在做其他事情,但我仍然有以下更新:

1)将代码移植到面向对象的性质。其中包括创建更多的函数。由于考虑到函数调用开销和数据传递的速度,我没有使用这种方法,但我的决定显然使调试和更新更加困难,以及在关键瓶颈点上潜在的“可选”mex替换。
2) TDMS查看器GUI
3)支万博1manbetx持可选地直接读取数据到双向量,而不是它被写入的格式和转换后的事实。

在对NL编写的代码进行了多次挫折之后,第一次尝试就完美地工作了。

您还需要将子函数文件夹添加到路径中。我最终想让这个类使一些方法私有和隐藏,但同时子函数文件夹只是帮助区分应该调用的函数和不应该调用的函数。

我试图读取。tdms文件与你在readMe.txt和我得到以下错误:
>> filename = 'Digital_Input.tdms';
my_tdms_struct = TDMS_getStruct(文件名)
data = TDMS_readTDMSFile ('Digital_input.tdms')

???未定义的函数或方法'TDMS_handleGetDataOption'用于类型的输入参数
“结构”。

错误==> TDMS_readTDMSFile在213
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

???未定义的函数或方法'TDMS_handleGetDataOption'用于类型的输入参数
“结构”。

错误==> TDMS_readTDMSFile在213
TDMS_handleGetDataOption(“检查”,paramsStruct)

劳拉

劳拉

非常感谢你的回复,吉姆,确实也再次提出了解决方案,工作完美!!
(我没有意识到我做了这样的改变,我的错误)
再次感谢

约翰:

谢谢你的宝贵意见。我在2010年底开始写这个文件,因为NI驱动程序不支持v2 TDMS文件,也因为这意味着实验室中的Mac用户要求我读取文件。万博1manbetx我以为NI肯定会推出v2的驱动程序,但经过足够的等待,我决定创建我自己的版本。当我写完代码后,我非常惊讶地发现还有另一个版本可用。我不知道在我无数的在线搜索中我是如何错过这一点的。您提到的代码实际上有多个版本可用。我尝试的第一个版本是v2(仍然可以在网上找到),数据类型的枚举是错误的。这是一个巨大的错误,代码仍然张贴。我已经查看了其他文件,我相信v6中那些实现代码的人没有意识到在一个“头”中可以多次读取数据(因为没有更好的词)。这意味着您可能向文件写入2000个值,但只返回100个,而实际上您需要读取文件19次才能获得所有2000个样本。 Version 9 is much better although it doesn't have the same functionality that mine does, particularly the ability to read only a part of a file, or to read interleaved data. At the time of this writing I believe that is the case, obviously this may change.

我认为这里有几个关键点:
1)发布同一个文件的多个版本不是一个好主意。版本2和版本6不应该存在于文件交换中,除非可能作为一些网站的链接用于存档,或者带有“此代码不起作用”的大警告标志。
2)更重要的是,我认为这指出了在文件交换的文件之间需要更好的代码集成,无论是在共享作者身份方面还是在创建数据入口点的能力方面。想象一下,如果在Mathworks网站上,我们可以创建一个名为“文件处理器”的部分,在它下面可以有一个到TDMS(美国国家仪器公司)的链接。在那个页面上,可以有一个关于格式的简短描述,以及人们提供的各种解决方案。万博 尤文图斯总的来说,我认为文件交换是过时的和无效的。我相信曾经有人尝试编写关于文件交换的包装器,但这些都被TMW关闭了。即使现在我正在把我的新代码转移到github上,尽管它失去了与语言/程序的联系,但我觉得有人可以更好地为我的代码做出贡献,并帮助制作社区软件。

约翰F

女士们先生们,这个文件运行得很好。如果您使用的是旧版本的Matlab,则必须用我所说的“哑变量”更改两个“~”占位符,因为不能识别~。

如果有人感兴趣,有另一个TDMS转换程序称为convertTDMS (v6)。我拼命地想弄清楚为什么那个代码不能正常工作。

不幸的是,convertTDMS只能读取文件的一部分。这个工作起来就像做梦一样。

如果有人有任何想法,为什么convertTDMS只是阅读我的文件的一部分,我很乐意听到你的理论。

最好的

摩根富林明
以前的新手,现在的新手

劳拉

附注:不同类型的数据只是在处理被修改为具有双重精度的文件时才会出现问题。原来的版本是可以的,但是,对单曲

劳拉

嗨,吉姆!,

我继续使用您的TDMS转换器(真的是一个很好的工作!)在您成功地建议转换双重格式的TDMS数据之后。

然而,我发现了另一个小问题,阻止我成功转换我的新tdms文件。我一直在看,但同样,到目前为止我还没能修好它。当尝试运行转换器时,我发现以下错误:

???试图访问数据类型(10);索引越界,因为数字(dataTypes)=3。

错误==> TDMS_readFileHelper_v1在76
if any(dataTypes ~= dataTypes(10))

错误==> TDMS_readTDMSFile在249
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

事实上,我的tdms文件有两种类型的数据:DT_FLOAT,(唯一存在的第一个tdms,我正在处理),但也是最后一组数据,现在是DT_DOUBLE。

如果我的tdms文件有两种类型的数据,我该怎么办?我能用这个转换器处理吗?

无论何时你有时间回复这个请求,都非常感谢!

最好的问候,
劳拉

理查德。

非常感谢你,吉姆。

德德里克,请检查我的电子邮件。谢谢。
吉姆

Dedric徐

嗨,吉姆,
我遇到了一个令人发狂的问题。我已经尝试使用你的功能读取我的tdms文件,但是失败了。我的文件有点大,大约60MB。

当我运行你的函数时,它崩溃了。

我使用的函数是[output,metaStruct] = TDMS_getStruct(filePath,4);

程序运行了大约20分钟,然后就崩溃了。

我得到了以下错误:

警告:FOR循环索引太大。截断到2147483647。
>在TDMS_readFileHelper_v1在66
在TDMS_readTDMSFile中的249
在TDMS_getStruct中57
使用TDMS_readFileHelper_v1错误(第184行)
检测到灾难性错误,代码可能在某个地方有错误

TDMS_readTDMSFile中的错误(第249行)
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

是Matlab版本的问题还是我遗漏了什么?

最好的问候,
Dedric

劳拉

劳拉

它工作得很完美!谢谢a lot for the program and for the fast help!
这真的是我在网上找到的tdms转换最好的工作

劳拉,你指出了一个我认为应该解决的问题,但我还没有触及到。一般来说,我发现尊重数据类型是很好的,这样可以防止用户的内存溢出,但显然有时您希望以双精度读入数据。

我最终想要更优雅地处理这个问题,但你可以尝试下面的方法来让事情正常工作:
1)在TDMS_initData中,从0中删除字符串规范,在你的情况下,它听起来像你想要case{9 25}是:
输出= 0 (1,nSamples,'single')而不是输出= 0 (1,nSamples,'single')
2)在TDMS_getTypeSeekSizes中将读取规范改为“type”而不是“type=>type”,在你的情况下,你想要的是“single”而不是“single=>single”

这两个更改将使所有双精度表都被读作单精度表。我最终想做一个干净的解决方案,但我最近太忙了。

劳拉

这是一些时间,我玩你的套路。这是一部奇妙的作品。然而,尽管可以很好地将复杂的.tdms文件转换到matlab,但我没有成功地修改转换值的精度。我猜是在readOptions中指定的(与默认值不同),并且在子例程TDMS_getTypeSeekSizes和TDMS_readFileHelper_v1中特别调用。我不是一个高级matlab用户。如果你能帮我更改这些设置,我将非常感激。
我的问题在于,我想有记录结构化数据的双精度,而不是单精度。
谢谢你的工作和关注

LV

Sergiy

约翰Vazey

就会得到一个错误
???错误使用==> TDMS_readFileHelper_v1在188
检测到灾难性错误,代码可能在某个地方有错误

还有人有这个问题吗?

合资企业

布莱恩

我是TDMS文件的新手,我只是假设它们都可以读取相同的内容。我的测试文件只是我从NI下载的一个示例文件。我不知道Raw DAQ MX不同于任何其他TDMS文件。

关于文档方面的改进,这可能是需要改进的一个方面。原始的DAQ MX数据是一种专有的Labview格式,我曾被拒绝获得这种类型的规格。我已经设法解析了几个例子,但由于我有这么少的例子,我还没有尝试实现它。在我的经验中,原始格式实际上只是作为一个普通的数据类型(在我的经验中是int16 ??)读取,具有指定如何将原始数据缩放为测量数据的属性。我不知道如何从元信息中提取真实的数据类型。从技术上讲,我可以把它当作一些数据类型,比如uint8,但要解析数据通常(不总是)依赖于知道数据类型的大小。此外,还有一些奇怪的元信息缓冲,我可以手动硬编码,但我不确定它是否总是存在。

也就是说,如果你有一个示例文件,我会有兴趣看看它,这样我最终可以提供一些变通办法。正如我所说,我在提取数据时运气不错。

我试图打开我的大数据文件:

[tmp,metaStruct] = TDMS_readTDMSfile('C:\Users\bjmarti4.NDC\Desktop\FIRST_LIGHT_CO2.tdms','GET_DATA_OPTION','getnone')

我得到以下错误:

???错误使用==> TDMS_processLeadIn在50
目前代码无法忽略/处理原始Daq MX数据

错误==> TDMS_preprocessFile在179
[flags,info] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

在==> tdms_examplefunctions95调用错误
(tmp metaStruct] =
TDMS_readTDMSfile(“C: \用户桌面\ \ bjmarti4.NDC \ FIRST_LIGHT_CO2.tdms’,‘GET_DATA_OPTION’,‘getnone’)

我可以打开一个小的测试文件,但是当我试图打开我的数据文件时,我就会得到错误

您可以按照自己的意愿详细地读取数据。请参阅文档文件TDMS_retrievingSubsets。在读取数据时,您可以获得您想要的任何细粒度,如果您愿意,可以指定通道和样本号。如果你认为文件中有什么需要澄清的,请让我知道。

仔细检查一下,我发现我在与meta_struct相关的文档中犯了一个错误。我将很快更新。

主要的错误是后续调用是,如果你读取更多的数据,并希望使用来自前一个调用的metaStruct来减少解析时间,你仍然需要再次传入文件名:

TDMS_readTDMSfile(文件名,“META_STRUCT”、metaStruct等)

我倾向于建议使用TDMS_getStruct,在这种情况下,您将使用:

TDMS_getStruct(文件名,versionNumber,{'META_STRUCT' metaStruct etc})

您的代码是否可以只读取大(~3.5 GB) TDMS文件的部分?我希望每次只处理一部分数据。如果是,我该怎么做?

安德里亚斯,我现在还没发现代码中有任何错误。请查看我发给你的信息。

该代码与Matlab 7.11工作吗?

我在32位(XP)和64位(Windows7)系统上用各种TDM/TDMS文件尝试过。
根据输入文件的类型,我得到2个不同的错误消息。对于NI的本地示例文件,反应是:

>> my_tdms_struct = TDMS_getStruct(filePath);
???错误使用==> TDMS_processLeadIn在33
头球意外领先

错误==> TDMS_preprocessFile在179
[flags,info] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

我自己生成的TDMS文件(阅读NI冠冕和Excel导入器没有问题)给出

???下标赋值维度不匹配。

错误==> TDMS_preprocessFile在456
rawDataInfo(curIndex).dataMatrix(indices,2) =…

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

是Matlab版本的问题还是我遗漏了什么?

最好的问候,
安德烈亚斯
[我是一个不同于之前在这里发帖的安德烈亚斯..]

你好安德烈亚斯,

我已经知道这个bug有一段时间了,只是还没有上传修复程序。我一直有点慢,因为我想纳入一些其他的变化,这是一个错误,将抛出反对失败的沉默和假装工作。我很快就会上传一个修改,但现在你只需要在TDMS_readFileHelper_v1中替换以下特定的大小写结构(从第100行开始):
数据类型->更改为->数据类型(1)

吉姆

嗨,吉姆,

看起来你的脚本完全符合我的需要。但是当我今天尝试使用它时,我的tdms文件出现了以下错误:

> >测试= TDMS_readTDMSFile(“test.tdms”)

???未定义函数或变量“dataType”。

错误==> TDMS_readFileHelper_v1 at 106
temp = fread(fid,numValuesRead*nChans,precisionType{dataType});

错误==> TDMS_readTDMSFile在258
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

读取索引文件工作正常,我得到以下结果:

> >测试= TDMS_readTDMSFile(“test.tdms_index”)

测试=
rootIndex: 1
groupIndices: 2
groupNames:{'模拟输入'}
chanIndices: {[3 4 5 6 7]}
chanNames: {{1x5 cell}}
数据:{[][][][][][][]}
propNames: {{1x1 cell} {1x0 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell}}
propValues: {{1x1 cell} {1x0 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell}
objectPathsOrig : {'/' '/' 模拟输入“/模拟输入“/”T”“/”模拟输入“/”U“/模拟输入”/“我”“/”模拟输入' / ' B”“/”模拟输入/ H”}
numberDataPointsRaw: [0 0 28000 28000 28000 28000 28000 28000 28000]
dataType: [0 0 10 10 10 10 10 10]
dataTypeName: {'void' 'void' 'double' 'double' 'double' 'double' 'double' 'double'}

也许你有一个提示,我必须在脚本中更改什么来读取我的tdms文件?

先谢谢你。

致以最亲切的问候

安德烈亚斯

这应该不是问题。原始格式目前不受支持,因为它的类型未指定。万博1manbetx

干得好,谢谢。
当我试图读取由NI-DAQmx . net tdmslologging函数直接创建的TDMS文件时,我得到一个错误。错误堆栈是:

???错误使用==> TDMS_processLeadIn在50
目前代码无法忽略/处理原始Daq MX数据
错误==> TDMS_preprocessFile在175
[flags,info] = TDMS_processLeadIn(fid,lastLetter);
错误==> TDMS_readTDMSFile在225
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);
错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

目前似乎不支持“原始DAQmx数据”。万博1manbetx这太糟糕了,因为只需几行代码就可以在MATLAB中创建数据记录器(只安装NI-DAQmx和基本MATLAB)。我会把这个分享给任何感兴趣的人。

是否有机会进行支持此数据类型的更新?万博1manbetx
杰夫

Craig发现了2.2版中出现的第二个错误。此错误影响所有以前的版本。带有“/”字符的组名当前解析错误。即将发布的v2.2更新将解决这个错误,以及get子集,ignore子集错误。注意:这两个bug都会导致错误,而不是无声地失败。谢谢大家让我知道你有一个问题,所以我可以改进代码。

吉姆

吉姆,请忽略我之前的评论。我已经解决了(愚蠢的用户错误)。我现在得到以下错误:
my_tdms_struct = TDMS_getStruct(文件名);
???在赋值A(I) = B中,B和中的元素数量
我一定也一样。

错误==> TDMS_readTDMSFile在255
groupIndices(curGroupCount) = I_groupObject;

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

curGroupCount的值为1,但I_groupObject是一个长度为14的数组,取值范围为2到15。不知道为什么不匹配

吉姆,我刚刚下载了你的文件,并试图从你的readMe.txt文件开始读取TDMS文件v2。当我运行TDMS_getStruct(文件名)并选择我的文件时,我得到以下错误消息:
???未定义函数或方法'TDMS_handleGetDataOption'用于类型为'struct'的输入参数。

错误==> TDMS_readTDMSFile在192
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

你知道我该怎么做吗?

发现v2.2中影响使用值为' get子集'或' ignore子集'的GET_DATA_OPTION的错误
这个错误已经抛出一个错误,让您知道读取不正确

如果你得到错误:
请求值的#不等于返回值的#,代码中可能出现错误
然后通过添加这一行来解决这个问题:
numValuesToGetActual(~keepDataArray) = 0;

在这几行之后:(大约第133行)
useSubset = false;
subsetInfo = struct([]);
numValuesToGetActual = metaStruct.numberDataPoints;

这将在下一个版本中修复。

嗯,

总的来说,代码看起来很好。我会把已经解析过的元结构扔回函数调用中,以节省处理时间。稍后我会给你一些说明。正如代码所述,当出现这样的问题时,很可能是我的错。一般来说,我尽量在可能的情况下检查,因为我宁愿事情不好,然后告诉你,而不是假装工作。我会给你发一封电子邮件,详细说明我们如何找到解决这个问题的方法。

吉姆

你好,
你这里有很好的代码,但我认为里面仍然有一个bug。我能够加载我的整个TDMS文件使用你的功能。这很好。不幸的是,我的一些数据集将是巨大的,由于内存问题必须加载和处理的部分。如果我试图使用您的函数读取数据的子集,我会得到一个错误。

下面是逐组读取和处理数据的代码:
---
获取TDMS内的内容列表
params = {'GET_DATA_OPTION','getnone'};
TDMS_Structure = TDMS_readTDMSFile(TDMS_File, params{:});
从TDMS文件中逐个读取和处理组
for GroupNumber = 1: nummel (TDMS_Structure.groupNames)
Params ={…
“GET_DATA_OPTION”、“getSubset’,……
“OBJECTS_GET”、结构(“groupsKeep”,{{TDMS_Structure.groupNames {GroupNumber}}})};
TempData = TDMS_readTDMSFile(TDMS_File, params{:});
%处理数据子集
ProcessData (TempData)
结束
---

我可以读取TDMS_Structure没有问题,但'TDMS_readTDMSFile'的子集加载调用产生一个错误:

---
???使用==> TDMS_readFileHelper_v1在211错误
请求值的#不等于返回值的#,代码中可能出现错误

错误==> TDMS_readTDMSFile在229
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);
---

这是一个错误,还是我只是用错误的参数你的代码?

嗨,菲奥娜,

谢谢你指出这个问题。本周初我真的很忙,但我可能会在周四或周五处理这个问题。详情请参阅我的电子邮件。

吉姆

感谢上传!
当我试图读取我的TDMS文件时,我得到了下面的错误。不知道有没有人能帮上忙。谢谢!

???在375中使用==> TDMS_preprocessFile错误
剩余的数据没有被分割成块,估计块数量:5.000000e-001

错误==> TDMS_readTDMSFile在198
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误在==>测试在11
[finalOutput,metaStruct] = TDMS_readTDMSFile(tdmsFileName)

是的。我在64位Windows上使用它,在64位Mac上进行了测试。

凯文

请告知这是否适用于64位matlab

@Guosong张
在2009b中引入~作为忽略输出的一种方式。如果输出需要大量内存,这可能特别有用。尽管我意识到不是每个人都在使用2009b或更高的版本,但我已经养成了使用它们的习惯。我可能会上传一个修复程序,其中我放回了虚拟变量,尽管我更倾向于写一个小脚本,允许检查版本,并在需要时替换所有文件。

Guosong张

???错误:文件:TDMS_readTDMSFile。m行:453列:11
表达式或语句不正确——可能不平衡(、{或[。

伤害

工作好了!带有dll的NI工具在我身上失败了(64位版本似乎不起作用,32位版本还可以)。
但这个更好;我认为它在Linux系统上也能运行。

伤害

Joacim,

我修复了统一码错误。1.1版应该很快就会发布。我误读了一些关于#字节vs #字符的文档。谢谢你指出我的错误。

吉姆

你好,

针对Joacim的评论:

1)文件大小应该没有限制(除了用户的内存大小),内存不足表示解析错误。

2)我仍然不确定代码处理unicode的效果如何。该错误似乎表明正确解析字符串的能力…

3)如果任何人看到类似的错误,请随时通过电子邮件给我一个示例文件,我很乐意尝试和修复代码,以便它得到处理。

谢谢,
吉姆

Joacim

你在这上面花了不少功夫。干得好,文件记录得很好。
测试了我的信号快车2009保存的数据功能。适用于小文件(<6 MB),但当试图加载较大的文件(>50 MB)它崩溃。
我很懒,所以我从NI下载了matlab_tdm_example_sp2010.zip。使用nilibddc.dll和approximate .dll。200行代码,包括注释,我在不到4秒的时间内读取了更大的文件(大约320 MB)。

下面是这次事故的一些信息。也许它能帮你解决问题:

testTDMSreading
266 propName = fread(fid,propNameLength,'*char')';
???使用==>读取错误
内存不足。键入HELP MEMORY作为选项。

错误==> TDMS_preprocessFile在266
propName = fread(fid,propNameLength,'*char')';

错误==> TDMS_readTDMSFile at 176
[rawDataInfo, numberDataPoints objectPaths segInfo] =
TDMS_preprocessFile (fid2 isIndexFID2 params);

错误==> testTDMSreading在34
output = TDMS_readTDMSFile(fullfileName,optionCA{:});

> > testTDMSreading
266 propName = fread(fid,propNameLength,'*char')';
K > > propNameLength
propNameLength =
1.9629 e + 009
K > >支撑材
fid =
12
K > > curProps
curProps =
第1至第8列
格式字符串的unit_string[1将字符]” ' [] [] [] [] []
第9至20栏
[] [] [] [] [] [] [] [] [] [] [] []
K > > iProp
iProp =
4
K > > propNameLength
propNameLength =
1.9629 e + 009

更新

1.13.0.0

在描述中增加了简单的使用示例

1.12.0.0

刚在描述里加了个链接

1.11.0.0

错误修复(潜在的静默错误),请参阅版本说明文件。

1.10.0.0

修正了一些交错数据的错误,以及在读取时间戳数据(不是属性)时,1904年之前的日期失败的错误。

1.9.0.0

修正了一个错误检查,我已经到位,被错误地抛出。
修正了带有'和/字符的对象名称的解析。

还允许只读取.tdms_index文件(用于调试)

1.8.0.0

2.2更新:
改进了子集处理的速度和专一性

1.7.0.0

上次更新(v2.0)时我有点快。它在解析数据子集方面有一些错误。

1.4.0.0

版本2的主要更新是从通道检索数据子集的能力。此外,我还添加了一些额外的包装器来处理数据检索。

1.3.0.0

版本1.2 -我有一个不正确的负号时,读取时间戳属性,产生一个无效的年份。数据时间戳读取是正确的,之前测试过:)
感谢Ed Zechmann指出了这个问题!增加了额外的convl .脚本v3

1.2.0.0

修正了读取unicode的主要错误。其他小的错误修复和改进可以在TDMS_VERSION_INFO中看到。

1.1.0.0

更新描述

MATLAB版本兼容性
使用R2010a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux