Le moyen le plus rapide pour importer des fichiers CSV dans MATLAB
J'ai écrit un script qui enregistre sa sortie dans un fichier CSV pour référence ultérieure, mais le second script pour importer les données prend une déhanchée quantité de temps pour le lire à nouveau.
Les données dans le format suivant:
Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9
où les en-têtes sont sur la colonne la plus à gauche, et les valeurs de données de prendre le reste de la ligne. Une difficulté majeure est que les tableaux de valeurs de données peuvent être de longueurs différentes pour chaque élément de test. J'avais l'enregistrer en tant que structure, mais j'ai besoin d'être en mesure de le modifier à l'extérieur de l'environnement, étant donné que parfois, je dois supprimer des lignes de mauvaises données sur un ordinateur qui n'a pas de MATLAB installé. Alors, vraiment, la première partie de ma question est: dois-je enregistrer les données dans un format différent?
Deuxième partie de la question:
J'ai essayé importdata, csvread, et dlmread, mais je ne suis pas sûr de qui est le meilleur, ou si il y a une meilleure solution. Actuellement, j'utilise mon propre script à l'aide d'une boucle et fgetl, qui est horriblement lent pour les gros fichiers. Des suggestions?
function [data,headers]=csvreader(filename); %V1_1
fid=fopen(filename,'r');
data={};
headers={};
count=1;
while 1
textline=fgetl(fid);
if ~ischar(textline), break, end
nextchar=textline(1);
idx=1;
while nextchar~=','
headers{count}(idx)=textline(1);
idx=idx+1;
textline(1)=[];
nextchar=textline(1);
end
textline(1)=[];
data{count}=str2num(textline);
count=count+1;
end
fclose(fid);
(Je sais que c'est probablement terriblement code écrit - je suis un ingénieur, pas un programmeur, merci de ne pas me crier après - toute suggestion d'amélioration serait la bienvenue, si.)
Vous devez vous connecter pour publier un commentaire.
Il serait probablement rendre les données plus faciles à lire si vous pouviez pad le fichier avec
NaN
valeurs lors de votre premier script crée:ou vous pouvez même les imprimer vider les champs:
Bien sûr, afin de pad correctement, vous devez savoir ce que le nombre maximum de valeurs sur tous les éléments avant la main. Soit avec le format ci-dessus, vous pouvez alors utiliser l'un des fichiers standard les fonctions de lecture, comme TEXTSCAN par exemple:
À la place de l'analyse de la chaîne de textline un caractère à la fois. Vous pouvez utiliser strtok de briser la chaîne, par exemple,
J'ai eu le même problème avec la lecture des données au format csv dans Matlab, et j'ai été surpris par le peu de soutien qu'il est, mais ensuite, j'ai juste trouvé l'importation de données de l'outil. Je suis dans r2015b.
Sur la barre en haut dans l'onglet "Accueil", cliquez sur "Importer des Données" et choisir le fichier que vous souhaitez lire. Une fenêtre d'application sera comme ceci:
Importation de Données de l'outil de capture d'écran
En vertu de "l'Importation de Sélection", vous avez la possibilité de "produire de la fonction", qui vous donne un peu d'options de personnalisation, y compris la façon de remplir les cellules vides, et ce que vous voulez que les données de sortie d'une structure. Et en Plus c'est écrit par the MathWorks, donc c'est probablement en utilisant la plus rapide méthode pour lire les fichiers csv. Il était presque instantané sur mon fichier.
T1) Si vous connaissez le nombre maximum de colonnes que vous pouvez remplir entrées vides avec NaN
Aussi, si toutes les valeurs sont numériques, avez-vous vraiment besoin "#" de la colonne? Si oui, vous pouvez utiliser uniquement "#", de sorte que toutes les données sont numériques.
T2) le moyen Le plus rapide pour lire num. de données à partir d'un fichier sans mex-files est csvread.
J'essaie d'éviter d'utiliser des chaînes de caractères dans des fichiers csv, mais si je le dois, je utiliser mon csv2cell fonction:
http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell