没有维度名称的可写
writetable without dimension names
我正在尝试使用 writetable
和 writetable(..., 'WriteRowNames', true)
从 table 编写 CSV,但是当我这样做时,Matlab 默认将 Row
放在CSV 的 (1,1) 单元格。我知道我可以通过设置 myTable.Properties.DimensionNames{1}
将 Row
更改为另一个字符串,但我不能将其设置为空白,所以看起来我被迫在其中包含一些文本 (1,1)细胞。
有没有办法让我的 CSV 的 (1,1) 元素留空而仍然写入行名称?
似乎没有任何方法可以设置 'DimensionNames'
field to either empty or whitespace. One option is to create your .csv file as you do above, then use xlswrite
中的任何字符数组以清除第一个单元格:
xlswrite('your_file.csv', {''}, 1, 'A1');
即使 xlswrite
文档指出文件参数应该是 .xls,它对我来说仍然可以正常工作。
不,目前不支持。我看到的唯一解决方法是使用占位符作为维度名称,然后以编程方式将其从文件中删除。
另一种方法可以使用 memmapfile
修改内存中文件的前导字节。
例如:
% Set up data
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
T = table(Age, Height, Weight, BloodPressure, 'RowNames', LastName);
% Write data to CSV
fname = 'asdf.csv';
writetable(T, fname, 'WriteRowNames', true)
% Overwrite row dimension name in the first row
% Use memmapfile to map only the dimension name to memory
tmp = memmapfile(fname, 'Writable', true, 'Repeat', numel(T.Properties.DimensionNames{1}));
tmp.Data(:) = 32; % Change to the ASCII code for a space
clear('tmp'); % Clean up
我们来自:
Row,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
收件人:
,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
遗憾的是没有完全删除,但这是一个有趣的方法。
或者,您可以使用 MATLAB 的 low level file IO 将行维度名称之后的所有内容复制到新文件,然后覆盖原始文件:
fID = fopen(fname, 'r');
fID2 = fopen('tmp.csv', 'w');
fseek(fID, numel(T.Properties.DimensionNames{1}), 'bof');
fwrite(fID2, fread(fID));
fclose(fID);
fclose(fID2);
movefile('tmp.csv', fname);
产生:
,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
writetable(T,fileFullPath,'WriteVariableNames',false);
当指定 'WriteVariableNames' 为 false(默认为 true)时,variable/dimension 名称将不会写入输出文件。
参考 link:https://uk.mathworks.com/help/matlab/ref/writetable.html
我正在尝试使用 writetable
和 writetable(..., 'WriteRowNames', true)
从 table 编写 CSV,但是当我这样做时,Matlab 默认将 Row
放在CSV 的 (1,1) 单元格。我知道我可以通过设置 myTable.Properties.DimensionNames{1}
将 Row
更改为另一个字符串,但我不能将其设置为空白,所以看起来我被迫在其中包含一些文本 (1,1)细胞。
有没有办法让我的 CSV 的 (1,1) 元素留空而仍然写入行名称?
似乎没有任何方法可以设置 'DimensionNames'
field to either empty or whitespace. One option is to create your .csv file as you do above, then use xlswrite
中的任何字符数组以清除第一个单元格:
xlswrite('your_file.csv', {''}, 1, 'A1');
即使 xlswrite
文档指出文件参数应该是 .xls,它对我来说仍然可以正常工作。
不,目前不支持。我看到的唯一解决方法是使用占位符作为维度名称,然后以编程方式将其从文件中删除。
另一种方法可以使用 memmapfile
修改内存中文件的前导字节。
例如:
% Set up data
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
T = table(Age, Height, Weight, BloodPressure, 'RowNames', LastName);
% Write data to CSV
fname = 'asdf.csv';
writetable(T, fname, 'WriteRowNames', true)
% Overwrite row dimension name in the first row
% Use memmapfile to map only the dimension name to memory
tmp = memmapfile(fname, 'Writable', true, 'Repeat', numel(T.Properties.DimensionNames{1}));
tmp.Data(:) = 32; % Change to the ASCII code for a space
clear('tmp'); % Clean up
我们来自:
Row,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
收件人:
,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
遗憾的是没有完全删除,但这是一个有趣的方法。
或者,您可以使用 MATLAB 的 low level file IO 将行维度名称之后的所有内容复制到新文件,然后覆盖原始文件:
fID = fopen(fname, 'r');
fID2 = fopen('tmp.csv', 'w');
fseek(fID, numel(T.Properties.DimensionNames{1}), 'bof');
fwrite(fID2, fread(fID));
fclose(fID);
fclose(fID2);
movefile('tmp.csv', fname);
产生:
,Age,Height,Weight,BloodPressure_1,BloodPressure_2
Smith,38,71,176,124,93
Johnson,43,69,163,109,77
Williams,38,64,131,125,83
Jones,40,67,133,117,75
Brown,49,64,119,122,80
writetable(T,fileFullPath,'WriteVariableNames',false);
当指定 'WriteVariableNames' 为 false(默认为 true)时,variable/dimension 名称将不会写入输出文件。
参考 link:https://uk.mathworks.com/help/matlab/ref/writetable.html