2015-06-04 2 views
0

У меня есть файл csv со смешанными окончаниями строки '\ n' и '\ r \ n'. При использовании csvread csvread сообщит об ошибке, а при использовании textscan textscan будет сканировать только содержимое до изменения символа окончания строки. Как я могу ввести этот файл в Matlab без предварительной обработки файла для исправления окончаний строки?читать csv файл со смешанным концом строки

пример файла:

fid = fopen('ex1.csv', 'w'); 
fprintf(fid, 'A,B,C\n'); 
fprintf(fid, '1,1,1\n'); 
fprintf(fid, '2,2,2\r\n'); 
fprintf(fid, '3,3,3\r\n'); 
fclose(fid); 

Обратите внимание, что заголовок ограничивает использование load и importdata пропустит последнюю строку.

+0

Если только заголовок является проблематичным, то вы можете поместить '% 'в начале строки. Затем MATLAB будет рассматривать это как комментарий, и 'load' будет работать. –

+1

@JeffIrwin Кроме того, просто откройте файл в редакторе Matlab и сохраните его; он автоматически преобразуется в правильный EOL (по крайней мере, в Windows). – Setsu

ответ

2

Update

С новым входом образца я не могу подтвердить, что ни один из встроенных методов работы желательно. Вот решение с помощью textscan и reshape:

fid = fopen('ex1.csv'); 
inputMatrix = textscan(fid, '%s', 'delimiter', ','); 
fclose(fid); 
inputMatrix = reshape(a{1}, 3, [])'; %'//assuming 3 columns in file 

>> inputMatrix 
    'A' 'B' 'C'  
    '1' '1' '1'  
    '2' '2' [1x2 char] %//the 2nd char is "\r" 
    '3' '3' [1x2 char] 

Кроме того, я обычно просто вернуться к старомодному способу чтения файлов, когда удобные функции не работают:

fid = fopen('ex1.csv'); 
inputMatrix = {}; 
while ~feof(fid) 
    line = fgetl(fid); 
    inputMatrix(end+1,:) = strsplit(line, ','); 
end 
fclose(fid); 

>> inputMatrix 
inputMatrix = 
    'A' 'B' 'C' 
    '1' '1' '1' 
    '2' '2' '2' 
    '3' '3' '3' 

Обратите внимание, что это имеет преимущество не заботясь о том, сколько столбцов есть, и оно также не включает \r.

В любом случае вы, вероятно, хотите, чтобы числа были числовой матрицей, а не матрицей ячеек строк. Простой вызов str2double будет делать это для вас (и это будет разумно игнорировать любые \r):

str2double(inputMatrix(2:end,:)) 

Предыдущая

Без файла примера я могу только сделать предложения на основе простого ввода Я создал локально, и мне кажется, что работают как importdata, так и load, в зависимости от того, как структурированы ваши входные данные.

Пример входных данных 1:

>> fid = fopen('ex1.csv', 'w'); 
>> fprintf(fid, '1,1,1\n'); 
>> fprintf(fid, '2,2,2\r\n'); 
>> fprintf(fid, '3,3,3\n'); 
>> fclose(fid); 

>> a = importdata('ex1.csv') 
ans = 
    1  1  1 
    2  2  2 
    3  3  3 
>> a = load('ex1.csv') 
ans = 
    1  1  1 
    2  2  2 
    3  3  3 

Пример входных данных 2:

>> fid = fopen('ex2.csv', 'w'); 
>> fprintf(fid, '1,1,1\n'); 
>> fprintf(fid, '2,2,2\r\n'); 
>> fprintf(fid, '3,3\n'); 
>> fclose(fid); 

>> a = importdata('ex2.csv') 
ans = 
    1  1  1 
    2  2  2 
    3  3  NaN 
>> a = load('ex2.csv') 
Error using load 
Number of columns on line 3 of ASCII file ex2.csv must be the same as previous lines. 
0

Я в конечном итоге с

fid = fopen('ex1.csv'); 
inputMatrix = cell2mat(textscan(fid, '%f%f%f%*[^\n]', 'delimiter', ',','headerLines',1)); 
fclose(fid); 


>> inputMatrix 

inputMatrix = 

    1  1  1 
    2  2  2 
    3  3  3 
Смежные вопросы