augusto 发表于 2012-10-7 20:27

如何读取文件中的指定行

请问如何从dat 文件中(10^9行 4列)读入指定行 (1000行到10^6)?
数据文件大于(60GB),所以不能够用textscan一次性读入。

我想在能够想到的方法是逐行读入,如下:
fid = fopen('data.dat');
nline = 0; % the line index
wline = 1000: 10^7; % the wanted lines
i = 1; % index for wline;
while ~feof(fid)||nline<max(wline)
    ldata = fgets(fid);
    nline = nline+1;
    if nline == wline(i)
      datas(i) = ldata;
      i= i+1;
      end   
end

问题2,请问如何读取文件的最后一行?

谢谢

ChaChing 发表于 2012-10-7 21:18

1."我想在能够想到的方法是逐行读入"?? what?
2."读入指定行 (1000行到10^6)" vs "wline = 1000: 10^7; % the wanted lines" ?? why?
3."问题2,请问如何读取文件的最后一行?" ??what?
4.LZ注意下使用fgets(fid)读入将是char并非1*4 double
5.个人习惯会先bypass 1000行后, 再开始读取所要的

ChaChing 发表于 2012-10-7 22:24

唉, LZ又忘记回应了
就假设LZ是要读数据, 但没资料可试, 不知是否正确!
fid = fopen('data.dat');
wline = 1000: 10^7; % the wanted lines
for ii=1:min(wline), fgetl(fid); end%% bypass 1000行
datas= fscanf(fid,'%e',);
datas=datas';



补充内容 (2012-10-9 22:30):
for ii=1:min(wline)-1, fgetl(fid); end%% bypass 999行

augusto 发表于 2012-10-9 17:25

ChaChing 发表于 2012-10-7 21:18 static/image/common/back.gif
1."我想在能够想到的方法是逐行读入"?? what?
2."读入指定行 (1000行到10^6)" vs "wline = 1000: 10^7; % ...

对不起。
谢谢您的回复。


1."我想在能够想到的方法是逐行读入"?? what?
// 这个地方应该是: 我现在能够想到的方法 是逐行读入


2."读入指定行 (1000行到10^6)" vs "wline = 1000: 10^7; % the wanted lines" ?? why?
// 这个意思敲错了,

3."问题2,请问如何读取文件的最后一行?" ??what?
// 例如说我有10^7行,我想查看最后一行(第10^7)的数据是多少
在linux中可以直接用system('tail -n 1 data.dat') 得到最后一行的数据,
请问在windows下,该如何做呢?


4.LZ注意下使用fgets(fid)读入将是char并非1*4 double
恩,是的,所以后来我在我的程序里加入了 sscanf,把其转化为 数据类型

5.个人习惯会先bypass 1000行后, 再开始读取所要的



augusto 发表于 2012-10-9 17:36

ChaChing 发表于 2012-10-7 22:24 static/image/common/back.gif
唉, LZ又忘记回应了
就假设LZ是要读数据, 但没资料可试, 不知是否正确!

谢谢大神的回复和指导。这个script是基本上正确。
只有一点瑕疵:

fid = fopen('pixels.dat');
wline = 1: 10000; % 设定连续的行数。
if wline(1) > 1
    for ii=1:(wline(1)-1), fgetl(fid); end%% bypass 1000行 //这个地方把min(wline) 改为了 wline(1) - 1,并用if来判定是否从第一行开始。
end
datas= fscanf(fid,'%e',);
datas=datas';
fclose(fid);

augusto 发表于 2012-10-9 17:42

ChaChing 发表于 2012-10-7 22:24 static/image/common/back.gif
唉, LZ又忘记回应了
就假设LZ是要读数据, 但没资料可试, 不知是否正确!

不过大神为啥说 一个 “又” 字呢?


恩,追问一下,如果要跳行读取的话,大神有什么建议吗?

wline 不在是连续的 1000: 10000, 而是改为[ 10: 40, 50:90, 1000: 10000],这样的非连续性,加一个for循环?

恩,非常感谢您的帮助

ChaChing 发表于 2012-10-9 22:46

1.抱歉, "又"字并非完全针对你而感慨!
2.个人并非大神, 可能仅是早入门吧了, 但的确许多大神好像都潜水了
3.针对跳行, 个人可能会
a)for循环(fscanf一行, fgetl一行)
b)fscanf两倍行再处理掉不要的
4.我想"查看最后一行"可能无法如同系统命令那般吧!? 个人目前只会土法子
5.不是连续的, 若没有规律可用, 个人目前也只会土法子(硬干)

happy 发表于 2012-10-19 09:50

如果数据文件结构规律性很好的,也可以考虑采用fseek直接定位
页: [1]
查看完整版本: 如何读取文件中的指定行