Автор Тема: Обработка на данни от апарат  (Прочетена 3206 пъти)

Yasen6275

  • Напреднали
  • *****
  • Публикации: 553
    • Профил
Предполагам че това което искам е елементарно, но познанията ми с awk, sed  и подобни е практически нулеви. Може и да има и по-човешки начин да се направи от това което съм намислил, но поне аз не знам. Ако има ще съм благодарен да го обясните.

Апарат изплюва данните  в директория с името на пробата и файл с име "data.txt" в нея. С цел статистическа проверка на апарата са пуснати много измервания при една и съща концентрация, за няколко различни концентрации. Всичките тези данни трябва да влезнат в една електронна таблица.

Файла изглежда по следния начин:
Код
GeSHi (C):
  1.                              Quantitation Report    (Not Reviewed)
  2.  
  3.  Data Path : C:\DATA\Verefication\
  4.  Data File : Z38961-18-500mg-s05.D                              
  5.  Acq On    : 25 Aug 2015   6:26
  6.  Operator  : ya
  7.  Sample    : Z38961-18-500mg-s05
  8.  Misc      :  
  9.  ALS Vial  : 7   Sample Multiplier: 1
  10.  
  11.  Quant Time: Aug 26 18:59:13 2015
  12.  Quant Method : C:\DATA\Verefication\Ver.Calc.M
  13.  Quant Title  : 1
  14.  QLast Update : Tue Aug 25 17:09:53 2015
  15.  Response via : Initial Calibration
  16.  
  17.          Compound                   R.T. QIon  Response  Conc Units Dev(Min)
  18.   --------------------------------------------------------------------------
  19.  
  20.   Target Compounds                                                   Qvalue
  21.     1) n-Dodecane                  8.610   57 36468494   432.04 mg/l      99
  22.     2) Carbaryl                   15.419  144 42552907   447.79 mg/l      99
  23.     3) Alpha HCH                  19.430  181 31385167   454.65 mg/l      96
  24.     4) Pirimiphos-ethyl           25.967  318 34752599   464.35 mg/l     100
  25.     5) Hexaconazole               28.510   83 36441476   447.38 mg/l      98
  26.     6) PCB 194                    32.516  394 47141857   465.55 mg/l     100
  27.     7) Cyhalothrin I (lambda)     35.211  181 20942983   509.91 mg/l      99
  28.     8) Cyhalothrin II (lambda)    35.562  181 18779375   505.64 mg/l      99
  29.     9) Di-n-octyl phthalate       37.555  149 121057699   430.25 mg/l     100
  30.   --------------------------------------------------------------------------
  31.  
  32.   (#) = qualifier out of range (m) = manual integration (+) = signals summed
  33.  
  34. Ver.Calc.M Wed Aug 26 18:59:13 2015
Data File реда съвпада с името на директорията. Концентрацията е преди "mg", а  номера на измерването е след тирето след "mg" и принадлежността  и към едната или другата група (има или няма s пред номера на измерването). Идеята  ми е накрая да имам по един  csv  файл за всеки един ред от таблицата ( PCB 194, Hexaconasole...). Колоните трябва да са: номер на измерването (ако има s да се махне), концентрация (взета от името), RT от таблицата във файла (една колона за пробите без s  в името и една за със),  Response (пак по една за със/без s).

Как си представям аз решението.

1. Преименувам всички файлове с име еднакво с това на директорията (и ги местя в една директория?).
2. Махам първите 20 и последните 5 реда от всички файлове
3. Обхождам файловете 9 пъти (по един за всеки ред от таблицата) и извличам от името или съдържанието нужните данни и ги записвам в нов файл.

Ще съм благодарен за всякакви насоки.
Активен

ji

  • Напреднали
  • *****
  • Публикации: 124
  • Distribution: Slackware, Suse
  • Window Manager: KDE
    • Профил
Re: Обработка на данни от апарат
« Отговор #1 -: Aug 29, 2015, 09:27 »
Аз бих използвал регулярни изрази за парсване на данните .
Един за мета иформацията на файла и един за данните от измерването.

За скоростна реализация, ще изполвам javascript.
Първо ще дебъгна (изтествам) изразите в конзолата firefox/chrome, после ще имплементирам набързо заданието с 3-4 финкции под nodejs.
Активен

jet

  • Напреднали
  • *****
  • Публикации: 3473
  • Distribution: debian
  • Window Manager: kde
    • Профил
Re: Обработка на данни от апарат
« Отговор #2 -: Aug 29, 2015, 17:27 »
Аз бих го импортирал в MySQL временна таблица
Код
GeSHi (C):
  1.  
  2. Orig_report                                                                                                     target_compound     rt       QIon      Response    Conc     Units      line    sample      date    time    is_data
  3. ---------------------------------------------------------------------------------------------------------- + --------------------- + ----- + ------ + ----------- + ------ + ------- + ----- + --------- + ----- + ---- + ------- +
  4.                              Quantitation Report    (Not Reviewed)                                                                                                                                  
  5.  
  6.  Data Path : C:\DATA\Verefication\                                                                                                                                  
  7.  Data File : Z38961-18-500mg-s05.D                                                                                                                                                                  
  8.  Acq On    : 25 Aug 2015   6:26                                                                                                                                  
  9.  Operator  : ya                                                                                                                                  
  10.  Sample    : Z38961-18-500mg-s05                                                                                                                                  
  11.  Misc      :                                                                                                                                    
  12.  ALS Vial  : 7   Sample Multiplier: 1                                                                                                                                  
  13.  
  14.  Quant Time: Aug 26 18:59:13 2015                                                                                                                                  
  15.  Quant Method : C:\DATA\Verefication\Ver.Calc.M                                                                                                                                  
  16.  Quant Title  : 1
  17.  QLast Update : Tue Aug 25 17:09:53 2015
  18.  Response via : Initial Calibration
  19.  
  20.          Compound                   R.T. QIon  Response  Conc Units Dev(Min)
  21.   --------------------------------------------------------------------------
  22.  
  23.   Target Compounds                                                   Qvalue
  24.     1) n-Dodecane                  8.610   57 36468494   432.04 mg/l      99              
  25.     2) Carbaryl                   15.419  144 42552907   447.79 mg/l      99                
  26.     3) Alpha HCH                  19.430  181 31385167   454.65 mg/l      96              
  27.     4) Pirimiphos-ethyl           25.967  318 34752599   464.35 mg/l     100
  28.     5) Hexaconazole               28.510   83 36441476   447.38 mg/l      98
  29.     6) PCB 194                    32.516  394 47141857   465.55 mg/l     100
  30.     7) Cyhalothrin I (lambda)     35.211  181 20942983   509.91 mg/l      99
  31.     8) Cyhalothrin II (lambda)    35.562  181 18779375   505.64 mg/l      99
  32.     9) Di-n-octyl phthalate       37.555  149 121057699   430.25 mg/l     100
  33.   --------------------------------------------------------------------------
  34.  
  35.   (#) = qualifier out of range (m) = manual integration (+) = signals summed
  36.  
  37. Ver.Calc.M Wed Aug 26 18:59:13 2015

после с цикли (например php, perl или pyton - там каквото знаеш) обикаляш таблицата и попълваш line - да расте от 1 до 37, sample еднакъв за всички 37 редове със данните от ред 7,  date, time съответно с данните от ред 14.
С цикъл попълваш и   target_compound,  rt,   QIon,  Response, Conc, Units - но САМО за редовете 21-29, другите редове не се попълват.
Само за редовете 21-29 се попълва поле is_data като "истина" например, всички други с "лъжа"
Можеш да си добавиш и още полета например за: оператор, ALS Vial, Sample Multiplier, file name, quant title, response via, ... etc
Така попълнената таблица се апендва към голямата таблица със всички измервания до момента със същата  структура.

Така освен, че ще имаш и отчетите в оригиналния им вид, но ще можеш да си правиш MySQL заявки и статистики за минали периоди, само за определени компоненти, по оператори, по макс. или минималин стойности, да усредняваш, да сортираш етц. Все неща, които после ще се бориш да правиш в Ексел-а
Експорт можеш да правиш в csv файл и от там в Ексел
Например: дай всички n-Dodecane, за период от дата... до дата само за is_data = true

Ако имаш Апаче на машината, можеш да направиш форми и визуализации и download на резултата
Активен

..⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁
  ⢿⡄⠘⠷⠚⠋
  ⠈⠳⣄⠀⠀⠀⠀  Debian, the universal operating system.

Yasen6275

  • Напреднали
  • *****
  • Публикации: 553
    • Профил
Re: Обработка на данни от апарат
« Отговор #3 -: Aug 30, 2015, 08:08 »
Сямо не мога да разбера защо ме псувате на влашки и двамата. ;)
Това не е нещо което се върши често. Максимум веднъж в годината а може и по-рядко. За това си мислех за нещо по-простичко.
За момента успях да си преместя/преименувам файловете както аз искам и да скълцам излишните редове с командите:
Код
GeSHi (Bash):
  1. for i in $(find . -type f|cut -d '/' - -f2); do cp $i/data.txt $i.txt ; done
  2. for i in $(find . -type f); do sed -i '30,34d' $i; done
  3. for i in $(find . -type f); do sed -i '1,20d' $i; done
С цел улесняване на живота премахнах белите полета в имената на компонентите с команди подобни на
Код
GeSHi (Bash):
  1. for i in $(find . -type f); do sed -i 's/PCB 194/PCB_194/g' $i; done
, и преименувах файловете така че да има "-" пред mg с:
Код
GeSHi (Bash):
  1. for i in $(find . -type f); do rename 's/0mg/0-mg/' $i; done
и превърнах файловете от space delimited  в  tab delimited  с:
Код
GeSHi (Bash):
  1. for i in $(find . -type f); do awk -v OFS="\t" '$1=$1' $i > tab/$i; done


И от тук на татък май трябва да се правя на баш майстор, защото нещата загрубяват и с едноредови команди май няма как да стане.

С малко врътки (копиране на файлове с нова директория, махане на "-s" от името, слагане на ".s" след ".txt" и връщане на файловете в директорията) си подготвям нещата за по-лесно извличане на данните.

И след 2 часа мъка по измислянето (20 мин) и дебъгването на скрипта се получи.
Код
GeSHi (Bash):
  1. for i in *.txt
  2. do
  3. for k in `seq 1 9`
  4. do
  5. order=$(sed -n "${k}p" $i | cut - -f1)
  6. name=$(sed -n "${k}p" $i | cut - -f2)
  7. rt=$(sed -n "${k}p" $i | cut - -f3)
  8. res=$(sed -n "${k}p" $i | cut - -f5)
  9. rtS=$(sed -n "${k}p" "$i.s" | cut - -f3)
  10. resS=$(sed -n "${k}p" "$i.s" | cut - -f5)
  11. num=$(echo $i | cut -d "-" - -f5)
  12. conc=$(echo $i | cut -d "-" - -f3)
  13. echo $num','$conc','$rt','$rtS','$res','$resS >> "$order.$name.csv"
  14. done
  15. done
Надявам се да не забравя къде съм го описал :) и да съм бил полезен на някого.
« Последна редакция: Aug 30, 2015, 12:40 от Yasen6275 »
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
Re: Обработка на данни от апарат
« Отговор #4 -: Aug 30, 2015, 13:48 »
$ echo hello | md5sum | cut -f 1 | wc -c
36
Дано това не те бърка нещо.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Обработка на данни от апарат
« Отговор #5 -: Aug 30, 2015, 14:26 »
Защо ви е да се тормозите с многократно изпълнение на команди върху набор от файлове, само ще си отровите живота в някой частен случай в който нов файл се появява докато се изпълняват командите.

Защо ви е да се тормозите с регулярни изрази след като форматът не е толкова детерминиран и горе в хедъра на репорта не е сигурно че няма да ви излязат търсените низове, за които ровите долу в показанията? После вероятно не е и известен, например не е ясно какво бълва апарата ако има грешка при вземане на пробата.

Затва най-добре един скрипт дето изчита рекурсивно всички текстови файлове в една директория и поддиректориите и и парсване ред по ред, с някакво елементарно пазене на състояние (дали сме във хедъра, дали сме в измерванията), проверки за валидност накрая (дали определени полета имат стойност) и генериране на csv реда в рамките на едно обхождане на файла, не на няколко такива. Това не би трябвало да е особено сложно.
Активен

"Knowledge is power" - France is Bacon

Yasen6275

  • Напреднали
  • *****
  • Публикации: 553
    • Профил
Re: Обработка на данни от апарат
« Отговор #6 -: Aug 30, 2015, 14:57 »
$ echo hello | md5sum | cut -f 1 | wc -c
36
Дано това не те бърка нещо.
Не разбрах какво те притеснява теб.
Защо ви е да се тормозите с многократно изпълнение на команди върху набор от файлове, само ще си отровите живота в някой частен случай в който нов файл се появява докато се изпълняват командите.
Идеята на занятието не е да работи в реално време, а при приключила работа на апарата да се извлекат данните.
Защо ви е да се тормозите с регулярни изрази след като форматът не е толкова детерминиран и горе в хедъра на репорта не е сигурно че няма да ви излязат търсените низове, за които ровите долу в показанията? После вероятно не е и известен, например не е ясно какво бълва апарата ако има грешка при вземане на пробата.
Хедъра и футъра на рапорта се реже преди да се ползват регулярните изрази. Вероятно нещата могат да се прецизират за изследване в което компонентите са повече или по-малко от девет.

Грешка при вземане на пробата води до спиране на апарата. Няма как да се тръгне да се обработват данните.
Затва най-добре един скрипт дето изчита рекурсивно всички текстови файлове в една директория и поддиректориите и и парсване ред по ред, с някакво елементарно пазене на състояние (дали сме във хедъра, дали сме в измерванията), проверки за валидност накрая (дали определени полета имат стойност) и генериране на csv реда в рамките на едно обхождане на файла, не на няколко такива. Това не би трябвало да е особено сложно.
Никой няма за цел пълна автоматизация. Задачата възникна поради ограничения на софтуера с който идва апарата. Не позволява да се обработват повече от 20 точки за компонент. При положение че имам 6 концентрации и за всяка имам 20 измервания, съм с точно 100 точки над лимита на софтуера. И както казах процедурата се прави относително рядко. За нормалното ползване на апарата, 20-те точки на компонент са повече от достатъчно.
Активен

Dojnow

  • Напреднали
  • *****
  • Публикации: 69
    • Профил
Re: Обработка на данни от апарат
« Отговор #7 -: Aug 30, 2015, 20:48 »
Код:
function D = conv_fn(fn)
conf='%*s%*s%*s%*s%f32%u16%u32%f32%*s%u8'; r=[7 4 7 4 1 4]; h=[20 0 0 0 0 0]; f={'RT','QIon','Response','Conc','Dev'};
fid=fopen(fn);                                             
for i=1:6, C(i)=cell2struct(textscan(fid,conf(r(i):end),rem(i,2)+1,'HeaderLines',h(i)),f,2); end
fclose(fid);
for i=1:5, D.(f{i})=vertcat(C.(f{i})); end;
Ако се използва само single (%f32), може още да се опрости. От D при много данни (файлове) може да се направи dataset и т.н...
Активен

Yasen6275

  • Напреднали
  • *****
  • Публикации: 553
    • Профил
Re: Обработка на данни от апарат
« Отговор #8 -: Aug 31, 2015, 18:50 »
Това на какъв език е?
Активен

Dojnow

  • Напреднали
  • *****
  • Публикации: 69
    • Профил
Re: Обработка на данни от апарат
« Отговор #9 -: Sep 01, 2015, 21:09 »
Цитат
Това на какъв език е?
Matlab. Апаратът, освен четим за хората файл, не издава ли и друг тип. Ако Compounds е с друг брой на думите в ред, може да се настроят константите във втория ред. Ако след всяко измерване са различни ето по-универсална функция:
Код:
function D=conv_fn(fn)
a=fscanf(fopen(fn),'%c'); D=[]; nl=10;%LF
a=a(strfind(a,'Qvalue')+7:strfind(a,'9)')+find(uint8(a(strfind(a,'9)'):end))==nl,1)-1);
while ~isempty(a)
    p=find(uint8(a)==nl,1);
    D=[D;sscanf(a(strfind(a,'.')-2:p),'%f%f%f%f%*s%f')'];
    a=a(p+1:end);
end
fclose('all');
Активен