阅读txt文件fscanf与fread vs. textscan

时间:2012-03-03 03:53:51

标签: file matlab file-io text-files

我有一个从SQL-2005(ANSI格式)生成的.txt文件。我尝试过textscanfscanf。整个txt文件只有numeric个数据。

在线资源表明fscanf比文本扫描更快,但我发现它不是。

  • Textscan比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';

2 个答案:

答案 0 :(得分:0)

理想情况下,您可以将数据转换为二进制格式,然后使用fread直接读取双精度数。我希望fread在这种情况下要快得多。 (字符串到数字的转换很昂贵,而原始二进制格式会导致文件小得多)。

否则,您可以使用fread读取字符,然后对传入的数据执行字符串到数字的转换(sscanf似乎是最好的)。唯一的技巧是你需要让你的读取批次以换行符结束,否则你的文本到字符串操作可能会产生不可预测的结果。您可以这样做,首先阅读大批字符,然后备份直至到达换行符,或者读取其他字符,直到找到该行的结尾。我发现这比fscanf的文本扫描要快一些......但是由于其他原因,我们的数字不匹配;我不确定该相信什么。

第二种方法的示例代码包含在先前的答案中(包括与该问题的大量重叠),以及一些时序结果。 https://stackoverflow.com/a/9441839/931379

答案 1 :(得分:0)

您还没有列出另一个选项:load

   L = load(fName);

这很简单,并会自动为您找出格式。它确实有一些限制 - 格式应该在每一行中具有相同数量的数字。