Edited bây giờ mà các câu hỏi đã được cập nhật với một tập tin đầu vào mẫu ...
Đối với trường hợp khi bạn biết có bao nhiêu cột dữ liệu sẽ có trong tập tin CSV của bạn, đơn giản gọi đến TEXTSCAN như Amro suggests sẽ là giải pháp tốt nhất của bạn.
Tuy nhiên, nếu bạn không biết một số trước là có bao nhiêu cột trong tệp của mình, bạn có thể sử dụng cách tiếp cận tổng quát hơn như tôi đã làm trong hàm sau. Lần đầu tiên tôi sử dụng hàm FGETL để đọc từng dòng của tệp vào một mảng ô. Sau đó, tôi đã sử dụng hàm TEXTSCAN để phân tích từng dòng thành các chuỗi riêng biệt bằng dấu phân tách trường được xác định trước và xử lý các trường số nguyên như chuỗi hiện tại (chúng có thể được chuyển đổi thành giá trị số sau).Dưới đây là mã kết quả, được đặt trong một hàm 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
Chạy chức năng này trên nội dung tập tin mẫu từ các câu hỏi đưa ra kết quả này:
>> 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' '' ''
Kết quả là một 3-by-10 mảng ô với một trường cho mỗi ô trong đó các trường bị thiếu được biểu thị bằng chuỗi trống ''
. Bây giờ bạn có thể truy cập mỗi ô hoặc kết hợp các ô để định dạng chúng theo ý muốn. Ví dụ, nếu bạn muốn thay đổi các trường trong cột đầu tiên từ dây để nguyên giá trị, bạn có thể sử dụng chức năng STR2DOUBLE như sau:
>> 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' '' ''
Lưu ý rằng các kết quả lĩnh vực có sản phẩm nào trong NaN giá trị.
Hãy xem qua textcan> http://www.mathworks.com/help/techdoc/ref/textscan.html – zellus
bạn nên đăng một vài hàng từ tệp CSV của mình để chúng tôi có ý tưởng về cách tệp có cấu trúc (là các chuỗi được trích dẫn bằng ''' hoặc '" ', chúng có chứa các dấu phẩy bên trong các trích dẫn hay không, là các giá trị số nguyên được trích dẫn, có bất kỳ dấu phân cách thoát nào chẳng hạn như' "đây là \" một ví dụ \ "" ' vv ...) – Amro
Xong :) Tôi hy vọng nó sẽ giúp một chút – poeschlorn