我有一个从SQL2005生成的.txt文件( ANSI格式)。我试过textscan和fscanf。整个txt文件只有numeric数据。
在线资源显示fscanf比文本扫描更快,但我发现情况并非如此。
快得多
我也想用fread来尝试这一点,但是我不知道如何使用fread导入数据。请你提出建议/评论好吗?谢谢。
fName = 'Test.txt' % From SQL in ANSI format, 5million rows, 5 Cols
Numofrows = 1000000 ; %1million
Numcols = 5 ;
fid = fopen(fName, 'r');
C = textscan(fid, '%f %f %f %f %f', Numofrows ) ;
C = cell2mat(C);
fclose(fid); fid = fopen(fName, 'r');
[C, Count] = fscanf(fid, '%f %f %f %f %f', Numofrows * Numcols ) ;
C = reshape(C, Count./Numofrows , Numofrows ) ; C=C';发布于 2012-03-03 06:14:55
理想情况下,您可以将数据转换为二进制格式,然后使用fread直接读取双精度数字。在这种情况下,我希望fread要快得多。(字符串到数字的转换是昂贵的,原始二进制格式将导致一个更小的文件)。
否则,您可以使用fread读取字符,然后对传入的数据执行字符串到数字的转换(sscanf似乎是最好的)。唯一的诀窍是,您需要让您的读批次以行中断结束,否则您的文本到字符串操作可能会产生不可预测的结果。您可以这样做:首先读取大量字符,然后备份直到到达换行,或者以其他字符读取,直到找到行尾。我发现这比任何一种文字扫描都要快.但由于其他原因,我们的数字不匹配;我不知道该相信什么。
第二种方法的示例代码包含在先前的答案中(包括许多与此问题重叠的部分),以及一些计时结果。https://stackoverflow.com/a/9441839/931379。
发布于 2012-03-03 09:48:27
还有一个您没有列出的选项:load
L = load(fName);它非常简单,并且会自动为您计算出格式。它确实有一些限制-格式应该有相同数量的数字在每一行。
https://stackoverflow.com/questions/9543281
复制相似问题