我正在努力拆分一个由 1 列 N 块组成的 txt 文件,该块由 1000 行组成。每个块的前 3 行是标题,后面是 1000 行数据。第 1001 行将是下一个以三个标头开头的块,如下所示:
#Header1
#Header2_1,Header2_2
#Header3
Data1_1-Data1_2
...
Data1000_1-Data1001_2
Header1
Header2
Header3
Data1002_1-Data1002_2
...
Data2003_1-Data2003_2
:::
每行数据由两组组成,所以我想将数据分成两列,以这种方式保留每个标题
Block1 | Block2 | Block3 ...
Header1 | Header1
Header2 1_1 | Header2 1_2 | Header2 2_1 | Header2 2_2
Header3 | Header3
Data1_1 | Data1_2 | Data1002_1 | Data1002_2
... | ...
Data1001_1 | Data1001_2 | Data2003_1 | Data2003_2
我尝试重塑但没有成功:
filename = 'text.txt';
data = splitlines(filename);
NRows = 1001;
NumBlocks = length(data)/NRows
Data_Reshaped = reshape(data,NRows,NumBlocks);
但它部分有效,因为我获得了一个 1001 x 12 单元格数组,每个单元格都有
Data1_1-Data1_2
以
-
作为分隔符。如何再次将此单元格按顺序分成两列并获得 1001x24 单元格数组?
结果应该导出到 Excel 中,但我想 writetable
函数应该可以完成这项工作。
您需要做三件事才能使您的数据足够平坦/统一以放入 Excel 中
将单标题行拆分为两个标题,其中第二个标题只是一个空字符串,但您需要两列,以便可以正确地与其他标题堆叠
将两个标题行拆分为两个标题,使用
,
作为分隔符
将数据行分成两行,使用
-
作为分隔符
我创建了一个示例(在本答案的底部),其中包含 3 个数据行用于测试:
首先,读入数据
% Use fileread to get the entire file contents, split on newlines
dat = fileread( 'C:\Users\WFeavyou\Desktop\text.txt' );
dat = splitlines( dat );
% Define the schema for this data: 3 header rows then 3 data rows
nHeaders = 3;
nDataRows = 3;
nPerBlock = nHeaders + nDataRows;
% Do an initial reshape to get each "block" into its own column of the cell
dat = reshape( dat, nPerBlock, [] );
现在我们可以执行上面的编号操作来获得每个单元格有两列的元胞数组:
% Split single-item headers from 'Header1' into {'Header1',''}
dat([1,3],:) = cellfun( @(x) {x,''}, dat([1,3],:), 'uni', 0 );
% Split two-item headers from 'Header2 2_1,Header2 2_2' into {'Header2 2_1','Header2 2_2'}
dat(2,:) = cellfun( @(x) strsplit( x, ',' ), dat(2,:), 'uni', 0 );
% Split the data from 'Data1_1-Data1_2' into {'Data1_1','Data1_2'}
dat(nHeaders+1:end,:) = cellfun( @(x) strsplit( x, '-' ), dat(nHeaders+1:end,:), 'uni', 0 );
现在您需要进行最后的重组以扩展和展平单元阵列:
dat = arrayfun( @(r) [dat{r,:}], 1:size(dat,1), 'uni', 0 );
dat = vertcat( dat{:} );
最终输出:
由于此时您的数据是元胞数组而不是表格(尽管看起来有点像表格),您可能想使用 writecell()
写入 Excel 或 csv。
示例数据text.txt
:
#Header1
#Header2 1_1,Header2 1_2
#Header3
Data1_1-Data1_2
Data2_1-Data2_2
Data3_1-Data3_2
#Header1
#Header2 2_1,Header2 2_2
#Header3
Data4_1-Data4_2
Data5_1-Data5_2
Data6_1-Data6_2
#Header1
#Header2 3_1,Header2 3_2
#Header3
Data7_1-Data7_2
Data8_1-Data8_2
Data9_1-Data9_2