大文本文件读入只有某些列gydF4y2Ba

33视图(30天)gydF4y2Ba
夏洛特gydF4y2Ba
夏洛特gydF4y2Ba 2013年10月24日gydF4y2Ba
评论道:gydF4y2Ba AshimgydF4y2Ba2016年1月4日gydF4y2Ba
我想读只有一个制表符分隔的某些列值文本文档(. tsv)的形式表有900列和100行。每一行的文本文件格式:gydF4y2Ba
8列% sgydF4y2Ba
112次的重复性:% d % d % d % d % d % d % sgydF4y2Ba
100列:% d(与我)gydF4y2Ba
我如何导入表单元阵列的维度(列数)*(行数)(反之亦然),而无需指定所有的900格式说明符(&跳过最后100列)?gydF4y2Ba
事实上,我只需要每8 + 6 * k列和每8 + 6 * (k + 1)列k = 1:112,即最后2元素(% d % s)序列的重复112次。gydF4y2Ba
使用textscan(文件标识,“% s”、“分隔符”,' \ t ');给我一个单元阵列的大小1 *(总数量元素)相反,这不是很可行处理如果我想用某些列。同样,我不知道如何解决,仅仅读一切作为字符串格式说明符问题。gydF4y2Ba
使用readtable (“filename.tsv”、“分隔符”,' \ t ');给我的错误信息:未定义的函数“readtable”“char类型的输入参数。gydF4y2Ba
2的评论gydF4y2Ba
图像分析gydF4y2Ba
图像分析gydF4y2Ba 2014年3月26日gydF4y2Ba
readtable只是R2013b之后,你可能有一个早期版本。gydF4y2Ba

登录置评。gydF4y2Ba

接受的答案gydF4y2Ba

塞德里克WannazgydF4y2Ba
塞德里克WannazgydF4y2Ba 2013年10月24日gydF4y2Ba
编辑:gydF4y2Ba塞德里克WannazgydF4y2Ba 2013年10月24日gydF4y2Ba
我做如下所示,假设你不想做的是建立gydF4y2Ba formatSpecgydF4y2Ba 由你自己。我们读文件的第一行识别非数字列(字符串),我们使用这些信息来建立一个合适的TEXTSCAN formatSpec。然后我们可以读取文件,选择转换单元阵列的列(细胞阵列和数字数组)到一个大细胞数组。gydF4y2Ba
文件名=gydF4y2Ba“myFile.tsv”gydF4y2Ba;gydF4y2Ba
% - - - - - -从第一行得到结构。gydF4y2Ba
fid = fopen(文件名,gydF4y2Ba“r”gydF4y2Ba);gydF4y2Ba
行= fgetl (fid);gydF4y2Ba
文件关闭(fid);gydF4y2Ba
isStrCol = isnan (str2double(正则表达式(线,gydF4y2Ba“[t ^ \] +”gydF4y2Ba,gydF4y2Ba“匹配”gydF4y2Ba)));gydF4y2Ba
%——构建formatSpec TEXTSCAN。gydF4y2Ba
fmt =细胞(1,元素个数(isStrCol));gydF4y2Ba
fmt (isStrCol) = {gydF4y2Ba' % s 'gydF4y2Ba};gydF4y2Ba
fmt (~ isStrCol) = {gydF4y2Ba' % f 'gydF4y2Ba};gydF4y2Ba
fmt = (fmt {:});gydF4y2Ba
% - - - - - -读完整的文件。gydF4y2Ba
fid = fopen(文件名,gydF4y2Ba“r”gydF4y2Ba);gydF4y2Ba
data = textscan (fid, fmt,正无穷,gydF4y2Ba“分隔符”gydF4y2Ba,gydF4y2Ba' \ t 'gydF4y2Ba);gydF4y2Ba
文件关闭(fid);gydF4y2Ba
% -可选:总列成大细胞数组。gydF4y2Ba
为gydF4y2BacolId =找到(~ isStrCol)gydF4y2Ba
{colId} = num2cell数据(数据{colId});gydF4y2Ba
结束gydF4y2Ba
数据=({}):数据;gydF4y2Ba
从那里,很容易选择相关的列。gydF4y2Ba
注意,这个解决方案假设没有空白列。如果它是不正确的,我真的可以更新解决方案适用于标签分隔符(事实上,TEXTSCAN似乎使用空格作为分隔符,即使只与特定的gydF4y2Ba \ tgydF4y2Ba 作为分隔符)。gydF4y2Ba
10评论gydF4y2Ba
AshimgydF4y2Ba
AshimgydF4y2Ba 2016年1月4日gydF4y2Ba
答案从塞德里克适用但当nan,以防出现在第一线,在这里“线”变量,代码返回的列作为字符串而不是双。你怎么克服呢?gydF4y2Ba

登录置评。gydF4y2Ba

更多的答案(2)gydF4y2Ba

西蒙gydF4y2Ba
西蒙gydF4y2Ba 2013年10月24日gydF4y2Ba
这就跟你问声好!gydF4y2Ba
我会回答我简短的例子:gydF4y2Ba
1 2 sgydF4y2Ba4gydF4y2Ba5gydF4y2Ba一个gydF4y2Ba5gydF4y2Ba
一个gydF4y2Ba4gydF4y2BacgydF4y2BadgydF4y2Ba6gydF4y2BafgydF4y2Ba我gydF4y2Ba
9 8 dgydF4y2BaggydF4y2Ba10gydF4y2Ba我gydF4y2BangydF4y2Ba
(所有标签分隔!)gydF4y2Ba
我想提取列2和5双,3和6弦(你需要ind1和ind2适应你的需求)gydF4y2Ba
%与textscan读入文件gydF4y2Ba
fid = fopen (gydF4y2Ba“tabdata.txt”gydF4y2Ba);gydF4y2Ba
FC = textscan (fid,gydF4y2Ba' % s 'gydF4y2Ba,gydF4y2Ba“分隔符”gydF4y2Ba,gydF4y2Ba' \ n 'gydF4y2Ba);gydF4y2Ba
文件关闭(fid);gydF4y2Ba
FC = FC {1};gydF4y2Ba
%将所有行(注意:最后一列不是加工! ! !)gydF4y2Ba
FCsplit = regexp (FC,gydF4y2Ba”(\ S *) (\ S)”gydF4y2Ba,gydF4y2Ba“匹配”gydF4y2Ba);gydF4y2Ba
%作为双列提取gydF4y2Ba
ind1 = 2:3:5;gydF4y2Ba
%列提取字符串(右邻居双打的列)gydF4y2Ba
ind2 = ind1 + 1;gydF4y2Ba
%准备双结果数组和字符串(如单元阵列)gydF4y2Ba
D = 0(长度(FCsplit), (ind1));gydF4y2Ba
S =电池(长度(FCsplit), (ind1));gydF4y2Ba
%遍历所有列提取gydF4y2Ba
为gydF4y2Ban = 1:长度(ind1)gydF4y2Ba
D (:, n) = cellfun (@ (x) str2double (x (ind1 (n))), FCsplit);gydF4y2Ba
(:,n) = cellfun (@ (x) strtrim (x (ind2 (n))), FCsplit);gydF4y2Ba
结束gydF4y2Ba
我不知道大文件的性能。试一下!gydF4y2Ba
2的评论gydF4y2Ba
西蒙gydF4y2Ba
西蒙gydF4y2Ba 2013年10月30日gydF4y2Ba
这就跟你问声好!gydF4y2Ba
“(\ S *)”列内容,除了白色空间。“[\ s]”分裂在白空间。gydF4y2Ba
如果你有空白你可能发现除了选项卡并分裂选项卡:gydF4y2Ba
FCsplit = regexp (FC,gydF4y2Ba”([t ^ \]) \ t 'gydF4y2Ba,gydF4y2Ba“匹配”gydF4y2Ba);gydF4y2Ba

登录置评。gydF4y2Ba


艾特威尔肯gydF4y2Ba
艾特威尔肯gydF4y2Ba 2013年10月24日gydF4y2Ba
您可以使用repmat避免打字' % * % * d % * % * % * d % d % s的112倍(还要注意使用‘*’跳过进口某些列。试试这样:gydF4y2Ba
formatSpec = [gydF4y2Ba% * % * % *年代年代% * % *年代% * % % * *年代年代的gydF4y2Barepmat (gydF4y2Ba' % * % * d % * % * % * d % d % s的gydF4y2Ba[1112])gydF4y2Ba“% * ^ \ [n]”gydF4y2Ba];gydF4y2Ba
formatSpec textscan(文件标识,gydF4y2Ba“分隔符”gydF4y2Ba,gydF4y2Ba' \ t 'gydF4y2Ba)gydF4y2Ba
2的评论gydF4y2Ba
夏洛特gydF4y2Ba
夏洛特gydF4y2Ba 2013年10月29日gydF4y2Ba
适用于格式说明符,谢谢!gydF4y2Ba
但从那里我还不知道如何阅读在我的数据单元阵列的维度(num的列)x (num的行)。gydF4y2Ba

登录置评。gydF4y2Ba

标签gydF4y2Ba

社区寻宝gydF4y2Ba

找到宝藏在MATLAB中央,发现社区如何帮助你!gydF4y2Ba

开始狩猎!gydF4y2Ba