Editado ahora que la cuestión se ha actualizado con un archivo de entrada de ejemplo ...
Para el caso cuando se sabe cuántas columnas de datos que habrá en el archivo CSV, una simple llamada a TEXTSCAN como Amro suggests será su mejor solución.
Sin embargo, si no conoce a priori cuántas columnas hay en su archivo, puede usar un enfoque más general como lo hice en la siguiente función. Primero utilicé la función FGETL para leer cada línea del archivo en una matriz de celdas. Luego usé la función TEXTSCAN para analizar cada línea en cadenas separadas usando un delimitador de campo predefinido y tratando los campos enteros como cadenas por ahora (se pueden convertir a valores numéricos más adelante).Aquí está el código resultante, se coloca en una función 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
La ejecución de esta función en el contenido del archivo de muestra de la pregunta da este resultado:
>> 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' '' ''
El resultado es un 3-por-10 matriz de celdas con un campo por celda donde los campos faltantes están representados por la cadena vacía ''
. Ahora puede acceder a cada celda o a una combinación de celdas para formatearlas a su gusto. Por ejemplo, si usted quiere cambiar los campos en la primera columna de cadenas en valores enteros, se puede utilizar la función STR2DOUBLE de la siguiente manera:
>> 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' '' ''
cuenta que los campos vacíos resultados en NaN valores.
Eche un vistazo a textscan> http://www.mathworks.com/help/techdoc/ref/textscan.html – zellus
debe publicar un par de filas de su archivo CSV para que tengamos una idea de cómo es el archivo estructurado (son las cadenas citadas con ''' o '" ', contienen comas dentro de las comillas, también se citan los valores enteros, ¿hay algún delimitador escapado como' "esto es \" un ejemplo \ "" ' etc ...) – Amro
Hecho :) Espero que ayude un poquito – poeschlorn