Dans le cas où vous savez combien de colonnes de données il y aura dans votre fichier CSV, un simple appel à textscan
comme Amro suggère sera votre meilleure solution.
Cependant, si vous ne savez pas a priori combien de colonnes il y a dans votre fichier, vous pouvez utiliser une approche plus générale comme je l'ai fait dans la fonction suivante. J'ai d'abord utilisé la fonction fgetl
pour lire chaque ligne du fichier dans un tableau de cellules. Ensuite, j'ai utilisé la fonction textscan
pour analyser chaque ligne en chaînes de caractères séparées en utilisant un délimiteur de champ prédéfini et en traitant les champs entiers comme des chaînes de caractères pour le moment (ils peuvent être convertis en valeurs numériques plus tard). Voici le code résultant, placé dans une fonction read_mixed_csv
:
function lineArray = read_mixed_csv(fileName, delimiter)
fid = fopen(fileName, 'r'); % Open the file
lineArray = cell(100, 1); % Preallocate a cell array (ideally slightly
% larger than is needed)
lineIndex = 1; % Index of cell to place the next line in
nextLine = fgetl(fid); % Read the first line from the file
while ~isequal(nextLine, -1) % Loop while not at the end of the file
lineArray{lineIndex} = nextLine; % Add the line to the cell array
lineIndex = lineIndex+1; % Increment the line index
nextLine = fgetl(fid); % Read the next line from the file
end
fclose(fid); % Close the file
lineArray = lineArray(1:lineIndex-1); % Remove empty cells, if needed
for iLine = 1:lineIndex-1 % Loop over lines
lineData = textscan(lineArray{iLine}, '%s', ... % Read strings
'Delimiter', delimiter);
lineData = lineData{1}; % Remove cell encapsulation
if strcmp(lineArray{iLine}(end), delimiter) % Account for when the line
lineData{end+1} = ''; % ends with a delimiter
end
lineArray(iLine, 1:numel(lineData)) = lineData; % Overwrite line data
end
end
L'exécution de cette fonction sur le contenu du fichier échantillon de la question donne ce résultat :
>> data = read_mixed_csv('myfile.csv', ';')
data =
Columns 1 through 7
'04' 'abc' 'def' 'ghj' 'klm' '' ''
'' '' '' '' '' 'Test' 'text'
'' '' '' '' '' 'asdfhsdf' 'dsafdsag'
Columns 8 through 10
'' '' ''
'0xFF' '' ''
'0x0F0F' '' ''
Le résultat est un tableau de 3 cellules sur 10, avec un champ par cellule, les champs manquants étant représentés par la chaîne vide. ''
. Vous pouvez maintenant accéder à chaque cellule ou à une combinaison de cellules pour les formater comme vous le souhaitez. Par exemple, si vous souhaitez transformer les champs de la première colonne, qui sont des chaînes de caractères, en valeurs entières, vous pouvez utiliser la fonction str2double
comme suit :
>> data(:, 1) = cellfun(@(s) {str2double(s)}, data(:, 1))
data =
Columns 1 through 7
[ 4] 'abc' 'def' 'ghj' 'klm' '' ''
[NaN] '' '' '' '' 'Test' 'text'
[NaN] '' '' '' '' 'asdfhsdf' 'dsafdsag'
Columns 8 through 10
'' '' ''
'0xFF' '' ''
'0x0F0F' '' ''
Notez que les champs vides donnent lieu à NaN
valeurs.
3 votes
Jetez un coup d'œil à textscan > mathworks.com/help/techdoc/ref/textscan.html
2 votes
Vous devriez poster quelques lignes de votre fichier CSV afin que nous puissions nous faire une idée de la structure du fichier (les chaînes de caractères sont-elles citées avec le symbole
'
ou"
contiennent-ils des virgules à l'intérieur des citations, les valeurs entières sont-elles également citées, y a-t-il des délimiteurs échappés tels que"this is \"an example\""
etc...)0 votes
C'est fait :) J'espère que cela vous aidera un peu