2011-12-07 20 views
11

Supongamos que hay un miarchivo.csv con nombres de variables en la primera fila y números decimales en los siguientes. En Matlab me gustaría leer la línea del encabezado y los números decimales por separado. Hasta ahora, he estado haciendo lo siguiente para extraer la línea de cabecera:Matlab: línea de encabezado de solo lectura de un archivo .csv

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s','Delimiter','\n'); 
b = a{1,1}; 
fclose(fid); 
c = textscan(b,'%s','Delimiter',','); 
d = c{1} 

Entonces, utilice el comando csvread para extraer la parte numérica del archivo. ¡Pero debería haber una forma (mucho) más fácil de hacerlo! Primero, no quiero leer todo el archivo (como con a = textscan(fid,'%s','Delimiter','\n');) para extraer solo la primera línea. En segundo lugar, parece incorrecto usar 7 líneas de código para hacerlo, ¿se puede hacer con menos?

Estaría agradecido por cualquier sugerencia constructiva.

+0

Gracias por la línea 3. Además, se ve mejor así :) – skip

Respuesta

3

abrir el archivo con fopen, leer la línea de cabecera con textscan, leer los números decimales con fscanf, y llamar a fclose en el extremo - a sólo 4 líneas en total :) Ejemplo archivo de entrada:

Weight,Size,Count 
1,2,3 
4,5,6 
7,8,9 
10,11,12 

Reading de este archivo:

fid = fopen('myfile.csv', 'r'); 
header = textscan(fid, '%[^,],%[^,],%[^,\r\n]', 1); 
data = transpose(fscanf(fid, '%g,%g,%g\n', [3, Inf])); 
fclose(fid); 

for i = 1 : 3; disp(['"' cell2mat(header{i}) '"']); end; 
disp(data); 

Tenga en cuenta que los datos leídos por fscanf necesitan ser incorporadas (lo he subrayado escribiendo transpose en lugar de 012.349.). La salida:

"Weight" 
"Size" 
"Count" 
    1  2  3 
    4  5  6 
    7  8  9 
    10 11 12 
+0

Muchas gracias! Pero, ¿y si quisiera escribir el código de una manera más universal, de modo que pueda usarse para archivos con diferentes cantidades de variables (en lugar de 3), sin reescribirlo cada vez que cambie la cantidad de variables? – skip

+1

En ese caso, leería la línea del encabezado con 'getl' y la analizaría con' strtok' para obtener el número de columnas, 'nc'. Después de determinar 'nc', la cadena de formato de' fscanf' se puede ensamblar usando un bucle (concatenando '% g's con comas en medio), y su último parámetro se puede establecer en' [nc, Inf] ' . Alternativamente, puede leer los números en una sola columna (usando '[1 Inf]'), y darle una nueva forma más tarde (n. ° de filas: 'nr = length (data (:))/nc;'). – kol

+0

¡Gracias por las respuestas completas! – skip

1

Para extraer la primera línea, sólo tiene

fid = fopen('myfile.csv'); 
a = textscan(fid,'%s',1); 
fclose(fid); 
Cuestiones relacionadas