Matlab - Tried importdata (.txt) ішінен деректерді шығару.

Деректерді тіркеушіден шығатын құрамында .txt файлдары бар. Деректер әр жолға бір хабарламамен және әр хабардың алдындағы хабар идентификаторымен өте нақты жолмен жазылады. Сондықтан, әр жолдың хабарламасының идентификаторын білу арқылы хабар пішіміне байланысты сол сызықта не болатынын білемін. Әр хабарлама (әр түрлі идентификатор) басқа пішімге ие. Деректердің мысалы:

$GPGGA,220542.000,4745.8026,N,12211.0284,W,1,07,1.3,3.4,M,-17.2,M,,0000*67
$GPGSA,A,3,30,05,29,31,02,10,25,,,,,,2.0,1.3,1.5*3D
$GPGSV,3,1,12,29,78,315,39,05,52,080,45,30,43,288,46,25,41,196,33*72
$GPGSV,3,2,12,21,31,249,30,02,23,066,41,12,17,172,38,31,11,276,40*7F
$GPGSV,3,3,12,10,07,036,30,26,02,115,,18,01,199,,48,34,194,37*73
$GPRMC,220542.000,A,4745.8026,N,12211.0284,W,0.08,174.78,271011,,*12
$GPGGA,220543.000,4745.8025,N,12211.0284,W,1,07,1.3,3.4,M,-17.2,M,,0000*65

Барлығы үтірмен бөлінген, бірақ әрбір жол әртүрлі болғандықтан (яғни, әр хабарлама бірдей пішімге ие емес), csv (Matlab ішіндегі) ештеңе жасай алмаймын.

Негізінде, мен не істеуді қалаймын - бұл деректер бойынша іздеу, сызық бойынша жол. Әрбір жол үшін хабарламаның идентификаторын анықтағым келеді, содан кейін жолдың қалған бөлігін массивте сақтаңыз, себебі сызықтың пішімін білемін. Соңында, әр хабар түрі үшін жиым боламын.

Мен бәрін csv арқылы excel-ке қоюға болады, бірақ әр жолы әртүрлі болғандықтан, деректерді шығарып алу қиын ... және бұл excel (мүмкін, бар болса) мүмкін екенін білмеймін.

Матлабта CSV ешнәрсе пайдалана алмаймын, себебі сандық емес мәндер бар. Мен файлды тікелей оқып көрдім және әрбір жолды fgetl() көмегімен қолдана бастадым, содан кейін әрбір жолға қадам бастым, бірақ одан да тиімді әдіс болуы керек. Мен excel файлын сақтау туралы бір нәрсе оқып алдым, содан кейін деректерді шығару үшін matlab-ге барамын, бірақ бұл аралық қадамды жоюға болады.

Бұл туралы қалай әрекет ету туралы ойлар жақсы болар еді. Мен ешкімге кодты жазуға тырыспаймын ... мені жазуға бағыттау үшін ғана.

О, мен importdata() жұмыс істейтінін ойладым, бірақ importdata ('filename.txt', ',') тырысты, бірақ ол бөлгішті танымайды ...?

0

1 жауаптар

Деректеріңіз аралас пішімдерге ие болғандықтан, процестің кез-келген нүктесінде сіз сызық бойынша айналдыруыңыз керек және оларды сәйкес пішімдерге сәйкес талдауыңыз керек. Сіз қарапайым функционалдық шақыру арқылы барлық нәрсені талдау мүмкіндігіне күмәнданамын ...

Міне, сіз файлды оқыған кезде (әртүрлі журналдардың пішімін сипаттаған жоқсыз), мен көрсеткен бірнеше сызыққа сүйене отырып, өзіммен бірге келдім.

Әрбір хабар түрі үшін журнал файлындағы тиісті жолдардың пішімі болуы керек. Біз файлдан барлық жолдарды оқып, әрқайсысынан хабар идентификаторын шығарамыз. Әрбір ықтимал хабардың ID идентификаторы үшін, сәйкес сызықтарды алып тастап, көрсетілген пішімді пайдаланып оларды бір-бірден талдайды және алынған ақпаратты сақтайды.

Нәтиже ұяшық массиві болады, әрбір хабар идентификаторы үшін бір ұяшық болады. Бұл элементтердің әрқайсысы өз бетімен жертөле болады, оқылған жолдар/бағандар түрінде сақталады.

%# line format for each type of message IDs
frmt = {
    '$GPGGA', '%s %f %f %c %f %c %f %f %f %f %c %f %c %f %s' ; 
    '$GPGSA', '%s %c %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %s' ; 
    '$GPGSV', '%s %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %s' ; 
    '$GPRMC', '%s %f %c %f %c %f %c %f %f %f %f %s' ; 
};

%# read log file as lines
fid = fopen('log.txt','rt');
C = textscan(fid, '%s', Inf, 'Delimiter','\n'); C = C{1};
fclose(fid);

%# get message ID of each line
msgId = strtok(C,',');

%# for each possible message ID
arr = cell(size(frmt,1),1);
for m=1:size(frmt,1)
    %# get lines matching this ID
    lines = C( ismember(msgId,frmt{m,1}) );

    %# parse lines using specified format
    arr{m} = cell(numel(lines), sum(frmt{m,2}=='%'));
    for i=1:numel(lines)
        arr{m}(i,:) = textscan(lines{i}, frmt{m,2}, 'Delimiter',',');
    end

    %# flatten nested cells containing strings
    idx = cellfun(@iscell, arr{m}(1,:));
    arr{m}(:,idx) = cellfun(@(x)x, arr{m}(:,idx));
end

log.txt

$GPGGA,220542.000,4745.8026,N,12211.0284,W,1,07,1.3,3.4,M,-17.2,M,,0000*67
$GPGSA,A,3,30,05,29,31,02,10,25,,,,,,2.0,1.3,1.5*3D
$GPGSV,3,1,12,29,78,315,39,05,52,080,45,30,43,288,46,25,41,196,33*72
$GPGSV,3,2,12,21,31,249,30,02,23,066,41,12,17,172,38,31,11,276,40*7F
$GPGSV,3,3,12,10,07,036,30,26,02,115,,18,01,199,,48,34,194,37*73
$GPRMC,220542.000,A,4745.8026,N,12211.0284,W,0.08,174.78,271011,,*12
$GPGGA,220543.000,4745.8025,N,12211.0284,W,1,07,1.3,3.4,M,-17.2,M,,0000*65

Жоғарыда көрсетілген файлға нәтиже:

>> arr
arr = 
    {2x15 cell}
    {1x18 cell}
    {3x20 cell}
    {1x12 cell}

мысалы, messageID = $ GPGGA сәйкес келетін жолдар:

>> arr{ ismember(frmt(:,1),'$GPGGA') }     %# arr{1}
ans = 
    '$GPGGA'    [220542]    [4745.8]    'N'    [12211]    'W'    [1]    [7]    [1.3]    [3.4]    'M'    [-17.2]    'M'    [NaN]    '0000*67'
    '$GPGGA'    [220543]    [4745.8]    'N'    [12211]    'W'    [1]    [7]    [1.3]    [3.4]    'M'    [-17.2]    'M'    [NaN]    '0000*65'
1
қосылды