merge multiple csv or xls files with different row and columns
Afficher commentaires plus anciens
Hello guys, i need help to do what describe in title. I have multiple csv files, with different rows and columns and i need to merge them in one single csv file. I don't know at all what to do.
I have created csv files, but if you think it's better dealing with xls files, i can also create them as xls.
However, whatever type they are, at the end i need to have just one single file (csv or xls).
Thanks
5 commentaires
Stephen23
le 25 Mai 2023
"I have multiple csv files, with different rows and columns and i need to merge them in one single csv file."
What exactly does "merge" mean? Perhaps vertical concatenation, or horizontal concatenation, or some kind of JOIN operation... we cannot guess what you intend, if you do not either explain it clearly of provide a sufficiently precise example.
Massimo
le 25 Mai 2023
dpb
le 25 Mai 2023
That'll be extremely awkward as a .csv file, in particular, if you don't have same number of variables/fields every record; csv files only work well with regular records. It can be made to work (in a fashion) otherwise, but not pleasant to deal with.
How are you going to know what belongs to what after you've done this? -- it would seem you'll have various "stuff" all mixed up together.
Better show us an example of what you've got and what you think you want and how it would be intended to be used...
Stephen23
le 26 Mai 2023
Isn't this something that WRITEMATRIX/WRITECELL/etal's RANGE option should be able to handle?
Walter Roberson
le 26 Mai 2023
Not when you are writing to a csv file. To add columns to a csv file, the (internal) code would have to read the entire file, insert the new values, and write out the result. As opposed to xls files which can be updated in-place.
Réponses (1)
Walter Roberson
le 25 Mai 2023
readcell() each file. Carefully concatenate them together
newrows = size(NewCell,1); newcols = size(NewCell,2);
AllCell(1:newrows, end:end+newcols) = NewCell;
afterwards writecell(AllCell)
8 commentaires
Massimo
le 25 Mai 2023
Walter Roberson
le 25 Mai 2023
AllCell = {};
for filenum = 0:2
filename = "File" + filenum + ".csv";
NewCell = readcell(filename);
newrows = size(NewCell,1); newcols = size(NewCell,2);
AllCell(1:newrows, end:end+newcols) = NewCell;
end
writecell(AllCell, "Combined.csv");
Walter Roberson
le 26 Mai 2023
AllCell(1:newrows, end+1:end+newcols) = NewCell;
% simulate some data returned from readcell
c{1}=num2cell(rand(4,3));
c{2}=num2cell(rand(1));
c{3}=num2cell(rand(3,2))
A={};
for i=1:3
[nr,nc]=size(c{i}); % readcell returns a nxm cell array
A(1:nr,end+1:end+nc)=c{:}
end
The output cell array still has to be rectangular even though it is a cell array; you could only catenate the disparate cell arrays by augmenting the sizes to all have the same number of rows -- if the first is the tallest, then you can do it by adding to the next one read; if one of those has more rows than a prior one, then have to augment the accumulator array to its size.
You could encapsulate the returned cell arrays from readcell into a cell array as I did to create the sample data, but when you do that, writecell doesn't write each cell in turn after catenating, it will just expand them all in a row...
% simulate some data returned from readcell
c{1}=num2cell(rand(4,3));
c{2}=num2cell(rand(1));
c{3}=num2cell(rand(3,2))
Assume we catenate the return from readcell as above
writecell(c, "Combined.csv") % write it out
I don't see any magic elixir here that would work without more effort. One could write a spreadsheet file by writing each file separately to the next available columns with the 'range' argument, but would have to keep running total of number columns written already.
It still doesn't make much sense to me to put such data together this way...
% simulate some data returned from readcell
c{1}=num2cell(rand(4,3));
c{2}=num2cell(rand(1));
c{3}=num2cell(rand(3,2))
A={};
for i=1:3
[nr,nc]=size(c{i}); % readcell returns a nxm cell array
A(1:nr,end+1:end+nc)=c{i}
end
Catégories
En savoir plus sur Spreadsheets dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!