2016-03-29 3 views
1

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

'1458937887.70818 $GPGGA,200228.90,3555.3269,N,15552.9641,A*25' 
'1458937887.709668 $GPVTG,56.740,T,56.740,M, 
0.069,N,0.127,K,D*2D' 
'1458937887.712022 $GPGGA,200229.00,3555.3269,N, 
15552.9641,C*2B' 
'1458937887.714071 $GPVTG,286.847,T,286.847,M,0.028,N,0.051,K,D*28' 

Я использую следующий читать данные:

textscan(fileID,'%s','Delimiter','\n') 

Однако, \n не то, что я хочу. Я хочу определить другой разделитель как букву (буквенно-цифровую), затем *, затем две буквы (буквенно-цифровые), затем \n.

Редактировать: Основная проблема заключается в том, что некоторые данные сохраняются в две строки. Например, строки 2 и 3 выше относятся к одному и тому же пакету данных.

ответ

2

Одно из предложений, которое я имею, состоит в том, чтобы прочитать весь файл как одну строку. Тогда вы можете удалить новые строки, которые помещены в файл самостоятельно. Как только вы это сделаете, используйте регулярные выражения для вставки новых строк новой строки после того, как вы найдете нужный шаблон, который является одним буквенно-цифровым символом, а затем звездочкой *, за которой следуют два буквенно-цифровых символа. После того, как мы, наконец, что использовать textscan с Delimiter флагом, чтобы отделить строки новыми символами новой строки мы поставили в.

Первое использование fread читать данные из файла. Мы можем слегка злоупотреблять этой командой, читая бесконечное количество символов, а это значит, что он будет читать весь файл до конца. Нам также необходимо убедиться, что мы укажем, что каждый дискретный элемент в этом файле является символом. Когда мы это сделаем, мы ищем любые символы новой строки и удаляем их. Если вы работаете в Windows, он не только вводит новые строки, но также вводит возврат каретки, но код, который я напишу, не зависит от этого факта. Нам нужно знать, что новая строка - это код ASCII 10, а возврат каретки - это код ASCII 13. Вывод fread фактически будет массивом double, где каждый элемент является кодом ASCII символа, замеченного в файле. Мы будем использовать индексацию logical, чтобы удалить эти элементы, затем используйте regexprep для поиска нужного шаблона и ввода символов новой строки. Как только мы это сделаем, мы, наконец, выбросим его в textscan, как вы его назвали.

Как таковой:

fileID = fopen('...'); %// Place filename here 
str = fread(fileID, [1 inf], 'char'); %// Read in the string as one array 

%// Remove newlines and carriage returns (if applicable) 
str(str == 10 | str == 13) = []; 

%// Search for the desired pattern and insert newlines after the pattern 
out = regexprep(char(str), '\w\*\w{2}', '$0\n'); 

%// Finally split up the strings 
txt = textscan(out, '%s', 'Delimiter', '\n'); 
txt = txt{1}; 

%// Close the file 
fclose(fileID); 

Когда мы используем regexprep, мы ищем алфавитно-цифровой символ \w, а затем звездочкой \* (\ важно здесь, потому что * используются в регулярных выражениях языка означает что-то другое. Чтобы обозначить фактический символ * в регулярном выражении, вы должны добавить символ \), а затем два буквенно-цифровых символа \w{2}. Результатом будут эти вхождения в ваш файл, удаленные из строк все вместе. Еще одна сложность заключается в том, что мы должны отличить от char, чтобы преобразовать строку, которая изначально была double, к char. Кроме того, вывод textscan в этом случае должен дать вам вложенный массив ячеек одного элемента, поэтому мы распаковываем ячейку, ссылаясь на первую ячейку. Желаемый выход находится в txt.

+0

Это не то, что я хочу. Я не хочу удалять эти символы. Возможно, я был недостаточно ясен. Проблема в том, что некоторые строки считываются в две строки, например, вторая и третья строки относятся к одному и тому же пакету данных.Вот почему я хочу продолжать чтение данных, пока не увижу эти символы вместо '\ n'. –

+0

Ahhh Я вижу. Ну, одно предложение - прочитать весь файл в виде строки, заменить нужный шаблон новой строкой, а затем передать его через textscan. Это единственный способ сделать это, если вы хотите использовать textscan. Я скоро изменю свой ответ. – rayryeng

+0

На самом деле у меня нет предпочтений. Мне просто нужен мой код для эффективной работы. –

Смежные вопросы