声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2849|回复: 7

[综合讨论] 如何读取文件中的指定行

[复制链接]
发表于 2012-10-7 20:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
请问如何从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,请问如何读取文件的最后一行?

谢谢
回复
分享到:

使用道具 举报

发表于 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行后, 再开始读取所要的
发表于 2012-10-7 22:24 | 显示全部楼层
唉, LZ又忘记回应了
就假设LZ是要读数据, 但没资料可试, 不知是否正确!
  1. fid = fopen('data.dat');
  2. wline = 1000: 10^7; % the wanted lines
  3. for ii=1:min(wline), fgetl(fid); end  %% bypass 1000行
  4. datas= fscanf(fid,'%e',[4, length(wline)]);
  5. datas=datas';
复制代码



补充内容 (2012-10-9 22:30):
for ii=1:min(wline)-1, fgetl(fid); end  %% bypass 999行
 楼主| 发表于 2012-10-9 17:25 | 显示全部楼层

对不起。
谢谢您的回复。

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行后, 再开始读取所要的


 楼主| 发表于 2012-10-9 17:36 | 显示全部楼层
ChaChing 发表于 2012-10-7 22:24
唉, 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',[4, length(wline)]);
datas=datas';
fclose(fid);

评分

1

查看全部评分

 楼主| 发表于 2012-10-9 17:42 | 显示全部楼层
ChaChing 发表于 2012-10-7 22:24
唉, LZ又忘记回应了
就假设LZ是要读数据, 但没资料可试, 不知是否正确!

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


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

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

恩,非常感谢您的帮助
发表于 2012-10-9 22:46 | 显示全部楼层
1.抱歉, "又"字并非完全针对你而感慨!
2.个人并非大神, 可能仅是早入门吧了, 但的确许多大神好像都潜水了
3.针对跳行, 个人可能会
  a)for循环(fscanf一行, fgetl一行)
  b)fscanf两倍行再处理掉不要的
4.我想"查看最后一行"可能无法如同系统命令那般吧!? 个人目前只会土法子
5.不是连续的, 若没有规律可用, 个人目前也只会土法子(硬干)
发表于 2012-10-19 09:50 | 显示全部楼层
如果数据文件结构规律性很好的,也可以考虑采用fseek直接定位

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-29 18:57 , Processed in 0.057432 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表