导入多个csv文件并提取一列数据以形成单个矩阵

时间:2012-12-14 02:08:58

标签: matlab csv for-loop import

我对MATLAB很新,所以我很确定这是一个非常简单的问题。我有几个输出数据集,每个都有一个前缀(例如PT_1到PT_20)。我想使用for循环将数据从每个csv文件的第二列导入到一个新矩阵,并将其与时间对齐,这在所有文件中都是常量。

输入文件看起来像

PT_1 .....

time    param 1 param 2 param 3
2/01/2001 23:00 11.449428   3   314.322471
3/01/2001 23:00 11.448935   3   311.683002

PT_2 .....

time    param 1 param 2 param 3
2/01/2001 23:00 11.445892   0   296.523937
3/01/2001 23:00 11.445393   0   294.0944

我希望我的输出看起来像

time    PT_1    PT_2
2/01/2001 23:00 11.449428   11.445892
3/01/2001 23:00 11.448935   11.445393

到目前为止,我得到的代码是

files = 0:1:21;
for i=1:21;
filename = sprintf('WQ_%d.csv', files(i));
origdata = importdata (filename);
end 

我可以看到它正确识别文件名,但它并没有真正按照我的意愿去做,因为它会在每个循环中写入数据。显然,我编码错了。 任何人都可以帮助我弄清楚如何为此编写合适的代码? 非常感谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

%# Set the number of csv files
DirectoryPath = 'FullDirectoryPathHereWithTrailingSlash';
NumFile = 2;

%# Open the first file and get the first column (the date column)
File1Path = [DirectoryPath, 'PT_1.csv'];
fid1 = fopen(File1Path, 'r');
Date = textscan(fid1, '%s %*[^\n]', 'Delimiter', ',', 'HeaderLines', 1);
fclose(fid1);

%Convert dates to matlab date numbers and get number of rows
Date = datenum(Date{1, 1}, 'dd/mm/yyyy');
T = size(Date, 1);

%# Preallocate a matrix to hold all the data, and add the date column
D = [Date, NaN(T, NumFile)];

%# Loop over the csv files, get the second column and add it to the data matrix
for n = 1:NumFile

    %# Get the current file name
    CurFilePath = [DirectoryPath, 'PT_', num2str(n), '.csv'];

    %# Open the current file for reading and scan in the second colum using numerical format
    fid1 = fopen(CurFilePath, 'r');
    CurData = textscan(fid1, '%*s %f %*[^\n]', 'Delimiter', ',', 'HeaderLines', 1);
    fclose(fid1);

    %Add the current data to the cell array
    D(:, n+1) = CurData{1, 1};

end

希望使用我提供的评论,代码应该是不言自明的。稍微棘手的一点是我用textscan函数的格式字符串。这是一个快速解释:

1)'%s %*[^\n]'说:获取第一列,即字符串格式(即%s)并跳过所有剩余的列(即%*[^\n])。

2)'%*s %f %*[^\n]'说:跳过第一列,即字符串格式(即%*s),得到第二列,这是一个浮点数(即%f) ,然后跳过所有剩余的列(即%*[^\n])。

更新:我刚刚更新了代码,在顶部包含一个变量,允许您指定csv文件所在的目录(如果它不是当前目录)。只需用适当的路径替换文本FullDirectoryPathHereWithTrailingSlash,例如Linux上的/home/username/Documents/或Windows上的C:\Windows\Blah\

我刚刚在两个名为PT_1.csvPT_2.csv的测试csv文件上测试了这段代码,其显示如下:

time, param 1, param 2, param 3
2/01/2001 23:00, 11, 3, 314.322471
3/01/2001 23:00, 12, 3, 311.683002

time, param 1, param 2, param 3
2/01/2001 23:00, 13, 0, 296.523937
3/01/2001 23:00, 14, 0, 294.0944

结果?

>> D

D =

      730853          11          13
      730854          12          14