2015-04-28 4 views
0

Я пытаюсь написать функцию для чтения нескольких (1000+) текстовых файлов ('.txt') в MATLAB. Ниже приведен фрагмент одного файла. Фактический файл имеет те же столбцы, но с ~ 150 000 строк.Чтение больших текстовых файлов в MATLAB

Start, Serial, DeviceId, RunNumber, Date, Real, Elapsed, X, EcgVal, EcgStatus, CapnoVal, CapnoStatus, P1Val, P1Status, P2Val, P2Status, P3Val, P3Status, Spo2Val, Spo2Status, CprDepth, CprFrequency, CprStatus, CprWaveVal, FiltEcgVal, FiltEcgStatus, Ecg2Val, Ecg2Status, Ecg3Val, Ecg3Status, Ecg4Val, Ecg4Status 
2013-01-01 23:51:12, 00017711, TEMS ACP272, , 01-01-2013, 23:51:12.000, 00:00:00.000, 41275.993889, 0.000000, -1, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0, 0.000000, 0.000000, 1, 0.000000, 1, 0.000000, 1, 0.000000, 1 
2013-01-01 23:51:12, 00017711, TEMS ACP272, , 01-01-2013, 23:51:12.008, 00:00:00.008, 41275.993889, 0.000000, -1, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0, 0.000000, 0.000000, 1, 0.000000, 1, 0.000000, 1, 0.000000, 1 
2013-01-01 23:51:12, 00017711, TEMS ACP272, , 01-01-2013, 23:51:12.016, 00:00:00.016, 41275.993889, 0.000000, -1, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0, 0.000000, 0.000000, 1, 0.000000, 1, 0.000000, 1, 0.000000, 1 
2013-01-01 23:51:12, 00017711, TEMS ACP272, , 01-01-2013, 23:51:12.024, 00:00:00.024, 41275.993889, 0.000000, -1, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0.000000, 0, 0, 0.000000, 0.000000, 1, 0.000000, 1, 0.000000, 1, 0.000000, 1 

Я пробовал очевидные подходы (csvread, dlmread, importdata) без успеха. Когда я открываю этот файл с помощью функции «ImportData», я получаю:

þS 

, а затем 5 пустых строк. Использование

fid = fopen('TEST.txt','r'); 
fgetl(fid) 

Я нахожу, что между каждой строкой данных имеется пустая строка и что между каждым символом есть пробел.

Я также попытался использовать TextScan функцию следующим образом

fid = fopen('TEST.txt','r'); 
c = textscan(fid, '%s', 'Delimiter', ',') 

но это возвращает пустую ячейку.

Альтернативой, которая работает, является открытие файла в Excel и сохранение его в виде файла CSV. Однако, учитывая, что я пытаюсь сделать это для 1000+ файлов, это невозможно.

Любые комментарии, предложения или советы приветствуются. Спасибо!

UPDATE:

Следующая, кажется, работает:

data = textscanu('TEST.txt'); 
str=textscan(data{1},'%s','Delimiter',',') 

Я буду стараться, чтобы написать это в общем, чтобы прочитать весь файл, пропускать пустые строки, а также организовать все столбцы.

+0

И хранить все, начиная со второй строки эти 32 столбцов в 'N x 32' размер ячейки для каждого текстового файла? – Divakar

+0

Да, это нормально. Я не слишком придирчив к формату - я могу переформатировать/упорядочить данные после их импорта. – DrDunkenstein

+1

как сохранить ваши файлы txt для начала? возможно ли, что они закодированы в некоторых 16 бит на символ вместо 8 бит на символ? возможно, какой-нибудь юникод? – Shai

ответ

0

Подход № 1: С importdata -

%// Import text data as string cells, assuming file1 is the path to text file 
data = importdata(file1,'') 

%// Split columns based on the delimiter: ' ' 
split_data = cellfun(@(x) strsplit(x,' ') , data(2:end),'Uni',0) 

%// Gather data into a N x number_of_entries cell array 
out_data = vertcat(split_data{:}) 

%// Remove the commas after each entry (if so desired) 
out_data = cellfun(@(x) strrep(x,',','') , out_data,'Uni',0) 

%// Remove the sixth columns that had extra commas 
out_data(:,6) = [] 

Подход № 2: С textscan -

%// Read entire text data into a cell of a cell array, 
%// assuming file1 is the path to text file 
fileID = fopen(file1,'r'); 
onecell_data = textscan(fileID,'%s','Delimiter','\n','HeaderLines',1); 
fclose(fileID); 

%// Unpack one level of data to have N x 1 sized cell array 
data = [onecell_data{:}] 

%// Split columns based on the delimiter: ' ' 
split_data = cellfun(@(x) strsplit(x,' ') , data(2:end),'Uni',0) 

%// Gather data into a N x number_of_entries cell array 
out_data = vertcat(split_data{:}) 

%// Remove the commas after each entry (if so desired) 
out_data = cellfun(@(x) strrep(x,',','') , out_data,'Uni',0) 

%// Remove the sixth columns that had extra commas 
out_data(:,6) = [] 
+0

Это не сработало для меня. Первая строка возвращает data = 'pS' – DrDunkenstein

+0

@DrDunkenstein Какова ваша версия и ОС MATLAB? Можете ли вы попробовать это вместо: 'data = importdata (file1, '% s')'? – Divakar

+0

У меня есть MATLAB 2012b и Windows 7 Ultimate. Просто собираюсь на встречу, но потом попробуем это. Также см. Обновление выше! – DrDunkenstein