2010-01-11 54 views
6

He escrito una secuencia de comandos que guarda su salida en un archivo CSV para referencia posterior, pero la segunda secuencia de comandos para importar los datos requiere una cantidad de tiempo desgarbada para volver a leerla.La forma más rápida de importar archivos CSV en MATLAB

los datos están en el formato siguiente:

Item1,val1,val2,val3 
Item2,val4,val5,val6,val7 
Item3,val8,val9 

donde las cabeceras están en la columna más a la izquierda, y los valores de los datos ocupan el resto de la fila. Una dificultad importante es que las matrices de valores de datos pueden tener diferentes longitudes para cada elemento de prueba. Lo guardaría como una estructura, pero necesito poder editarlo fuera del entorno de MATLAB, ya que a veces tengo que eliminar filas de datos incorrectos en una computadora que no tiene instalado MATLAB. Entonces, la primera parte de mi pregunta es: ¿Debería guardar los datos en un formato diferente?

la segunda parte de la pregunta: ¿ He intentado importdata, csvread y dlmread, pero no estoy seguro de qué es lo mejor, o si hay una solución mejor. En este momento estoy usando mi propio script usando un loop y fgetl, que es terriblemente lento para archivos grandes. ¿Alguna sugerencia?

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); 

(Sé que este código es probablemente terriblemente escrita - soy ingeniero, no un programador, por favor no me gritan -. Alguna sugerencia de mejora sería bienvenido, sin embargo)

Respuesta

10

es probablemente haría que los datos sean más fáciles de leer si pudiera rellenar el archivo con los valores NaN cuando su primer script que crea:

Item1,1,2,3,NaN 
Item2,4,5,6,7 
Item3,8,9,NaN,NaN 

o incluso podría simplemente imprimir los campos vacíos:

Item1,1,2,3, 
Item2,4,5,6,7 
Item3,8,9,, 

Por supuesto, con el fin de rellenar correctamente, debe saber cuál es el número máximo de valores en todos los elementos antes de la mano. Ya sea con el formato anterior, se puede entonces utilizar una de las funciones de lectura de archivo estándar, como por ejemplo TEXTSCAN:

>> fid = fopen('uneven_data.txt','rt'); 
>> C = textscan(fid,'%s %f %f %f %f','Delimiter',',','CollectOutput',1); 
>> fclose(fid); 
>> C{1} 

ans = 

    'Item1' 
    'Item2' 
    'Item3' 

>> C{2} 

ans = 

    1  2  3 NaN %# TEXTSCAN sets empty fields to NaN anyway 
    4  5  6  7 
    8  9 NaN NaN 
3

En lugar de analizar la cadena línea de texto un carácter a la vez. Se podría utilizar strtok para romper la cuerda hacia arriba, por ejemplo,

stringParts = {}; 
tline = fgetl(fid); 
if ~ischar(tline), break, end 
i=1; 
while 1 
    [stringParts{i},r]=strtok(tline,','); 
    tline=r; 
    i=i+1; 
    if isempty(r), break; end 
end 

% store the header 
headers{count} = stringParts{1}; 

% convert the data into numbers 
for j=2:length(stringParts) 
    data{count}(j-1) = str2double(stringParts{j}); 
end 
count=count+1; 
+0

+1 para recomendar strtok - No sabía que existía antes de – Doresoom

0

Q1) Si conoce el número máximo de columnas que puede llenar entradas vacías con NaN Además, si todos los valores son numéricos, lo que realmente necesita Columna "Artículo n. °"? Si es así, solo puede usar "#", por lo que todos los datos son numéricos.

Q2) La forma más rápida de leer num. los datos de un archivo sin mex-files son csvread. trato de evitar el uso de cadenas en archivos CSV, pero si tengo que hacerlo, usar mi función csv2cell:

http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell

+0

La columna Item # es en realidad etiquetas de texto, así que sí, la necesito. Probablemente debería haber aclarado eso. – Doresoom

1

que he tenido el mismo problema con la lectura de datos CSV en Matlab, y me sorprendió por la poca ayuda que hay para esto, pero luego encontré la herramienta de importación de datos. Estoy en r2015b.

En la barra superior de la pestaña "Inicio", haga clic en "Importar datos" y elija el archivo que desea leer.Una ventana de la aplicación se van a plantear así:

Import Data tool screenshot

Bajo "Importar la selección" tiene la opción de "generar la función", que le da un poco de opciones de personalización, incluyendo cómo rellenar las celdas vacías, y lo que le gustaría que fuera la estructura de datos de salida. Además, está escrito por MathWorks, por lo que probablemente esté utilizando el método más rápido disponible para leer archivos csv. Fue casi instantáneo en mi archivo.

Cuestiones relacionadas