我有几个包含3列的CSV文件:
标识符只是按照1-950的顺序运行,但每个样本中都不存在,因此每个CSV文件都不存在。
有没有办法使用Excel或MATLAB填写不存在的数字?这样,当我将它们组合成2D阵列时,它们一起排列。
目前它看起来像:
Compound Name,Peak Value,Volume
1,627434.8768,5.50E+07
5,2.53E+07,5.11E+08
7,1.64E+07,3.07E+08
理想情况下,它会是
Compound Name,Peak Value,Volume
1,627434.8768,5.50E+07
2,0,0
3,0,0
4,0,0
5,2.53E+07,5.11E+08
6,0,0
7,1.64E+07,3.07E+08
答案 0 :(得分:0)
如果您的标识符始终是自然数字,那么在Matlab中您只需索引即可完成:
input = [1, 627434.8768, 5.50E+07
5, 2.53E+07, 5.11E+08
7, 1.64E+07, 3.07E+08];
output = zeros(max(input(:,1)), size(input,2)); %// initiallize with zeros
output(input(:,1),:) = input; %// fill in available values
答案 1 :(得分:0)
我将使用MATLAB提供解决方案。您可以先使用csvread
读取数据,但跳过第一行,因为它包含标题。之后,创建一个2D矩阵,其中第一行描述为1到950.接下来,使用通过csvread
读入的数据的第一列并索引到此2D矩阵,以便您可以存储相应的行此矩阵中的每个标识符。完成后,将此新矩阵写入新文件。
当然,您需要先打开原始文件才能获得标题,将其写入新文件,然后您的数据应该跟随。您可以使用fopen
打开文件,然后fgetl
检索原始文件的第一行。
我们假设您的文件名为test.csv
。代码看起来像这样:
M = csvread('test.csv', 1, 0); %// Parse through file starting from second row
out = [(1:950).' zeros(950,2)]; %// Create empty 2D matrix like before
out(M(:,1),2:3) = M(:,2:3); %// Populate the matrix and index into the right rows
fid = fopen('test.csv', 'r'); %// Open up the original file for reading
fid2 = fopen('out.csv', 'w'); %// Open up the output file for writing
first_line = fgetl(fid); %// Get the first line of the original file
fprintf(fid2, '%s\n', first_line); %// Write this first line to the output file
fprintf(fid2, '%d,%e,%e\n', out.'); %// Write the modified 2D array to file
fclose(fid); fclose(fid2); %// Close both of the files
以上代码不言自明,附有注释。输出CSV文件被写成一个名为out.csv
的文件。但是,我将指出的复杂性是第二行代码。看看我如何将第一列打印为整数('%d'
修饰符),而其他数字是指数表示法('%e'
修饰符),以满足您在上面显示的示例。此外,MATLAB以 column-major 格式处理数据,因此您实际上需要将矩阵的转置写入文件(因此.'
运算符) 。
使用您的测试数据和上面的代码,这里是输出CSV文件中的前11行(10个数据+行标题):
Compound Name,Peak Value,Volume
1,6.274349e+05,5.500000e+07
2,0.000000e+00,0.000000e+00
3,0.000000e+00,0.000000e+00
4,0.000000e+00,0.000000e+00
5,2.530000e+07,5.110000e+08
6,0.000000e+00,0.000000e+00
7,1.640000e+07,3.070000e+08
8,0.000000e+00,0.000000e+00
9,0.000000e+00,0.000000e+00
10,0.000000e+00,0.000000e+00