在计数系列中填写插页式数据

时间:2015-01-27 22:15:37

标签: excel matlab csv

我有几个包含3列的CSV文件:

  • 第1列是标识符
  • 第2列是相应的浓度和
  • 第3列是一个卷。

标识符只是按照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

2 个答案:

答案 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