我有一个从SQL-2005(ANSI格式)生成的.txt文件。我尝试过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';
答案 0 :(得分:0)
理想情况下,您可以将数据转换为二进制格式,然后使用fread
直接读取双精度数。我希望fread
在这种情况下要快得多。 (字符串到数字的转换很昂贵,而原始二进制格式会导致文件小得多)。
否则,您可以使用fread
读取字符,然后对传入的数据执行字符串到数字的转换(sscanf似乎是最好的)。唯一的技巧是你需要让你的读取批次以换行符结束,否则你的文本到字符串操作可能会产生不可预测的结果。您可以这样做,首先阅读大批字符,然后备份直至到达换行符,或者读取其他字符,直到找到该行的结尾。我发现这比fscanf的文本扫描要快一些......但是由于其他原因,我们的数字不匹配;我不确定该相信什么。
第二种方法的示例代码包含在先前的答案中(包括与该问题的大量重叠),以及一些时序结果。 https://stackoverflow.com/a/9441839/931379。
答案 1 :(得分:0)
您还没有列出另一个选项:load
L = load(fName);
这很简单,并会自动为您找出格式。它确实有一些限制 - 格式应该在每一行中具有相同数量的数字。