2015-12-04 29 views
1

我是一位与大数据一起工作的新手,因此希望下面的问题有一个简单的解决方案。任何帮助将不胜感激。从大型文本文件中提取列

我一直在用EmEditor修改一个~2GB的文本文件,它是315,000x1706。每列的标题随机包含1或2个。这里是什么,我有一个小图片:

1 2 2 1 1 1 2 1   1 1 1 1 1 2 2 2 

AA TT TA CT TT GA TA CT   AA CT TT GA CT TT TA TA 
AA TT TA CT TT GA TA CT   AA CT TT GA CT TT TA TA 
AA TT TA CT TT GA TA CT   AA CT TT GA CT TT TA TA 
     (File)      (File 1)  (File 2) 

我需要打入两个文件,一个只用“1”列和另一只“2”列此。

有关如何做到这一点的任何建议?该文件太大而无法在Excel中打开。这些数据最终将在Matlab中结束。这可以用Matlab来完成吗?

谢谢

+0

你能够达到你想要的小文本文件吗?使用文本文件,您基本上必须逐行阅读并处理它。 – Daniel

+0

即使使用较小的文件,我也不知道从哪里开始。 – dps2501

+0

我假设沿着'AA TT TA CT TT GA TA CT'的线有多行?如果您编辑问题以提供文件内容的更完整的小例子,这将会很有帮助。 – horchler

回答

2

下面是使用textscan读取数据的方式和fprintf把它写:

% Read data 
f0 = 'data0.txt'; 
fid = fopen(f0,'r'); 
head = textscan(fid,'%u'); 
data = textscan(fid,'%2s'); 
fclose(fid); 

% Process data 
idx = (head{1}==1); 
data = reshape(data{1},numel(idx),[]); 

% Write file corresponding to 1s in header 
f1 = 'data1.txt'; 
fid = fopen(f1,'w+'); 
fprintf(fid,[repmat('%s ',1,nnz(idx)-1) '%s\n'],data{idx,:}); 
fclose(fid); 

% Write file corresponding to 2s in header 
f2 = 'data2.txt'; 
fid = fopen(f2,'w+'); 
fprintf(fid,[repmat('%s ',1,nnz(~idx)-1) '%s\n'],data{~idx,:}); 
fclose(fid); 

上述唯一潜在的问题是,你可能有内存问题,如果您的文件足够大。

+0

谢谢!我会在这个周末给这个投篮。我正在使用的机器有32GM RAM。否则,我会分割文件。再次感谢! – dps2501