This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
medicacion2021 [2021/03/27 13:28] osotolongo [Limpieza] |
medicacion2021 [2021/04/03 10:42] (current) osotolongo [tl;dr] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Informe de medicacion ====== | ====== Informe de medicacion ====== | ||
+ | Ver programas en github: https:// | ||
+ | |||
+ | ===== tl;dr ===== | ||
+ | |||
+ | El formato de la base de datos de input ha de ser: | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | y se ejecutan dos scripts consecutivos, | ||
+ | |||
+ | <code bash> | ||
+ | $ ./parse.pl medicamentos.db | ||
+ | $ ./ | ||
+ | </ | ||
+ | |||
+ | Y los resultados quedan en el archivo // | ||
===== Antes de empezar ===== | ===== Antes de empezar ===== | ||
Line 23: | Line 40: | ||
Asi que hacemos, | Asi que hacemos, | ||
<code bash> | <code bash> | ||
- | [osotolongo@brick03 medicacion]$ awk -F";" | + | [osotolongo@brick03 medicacion]$ awk -F";" |
</ | </ | ||
Line 29: | Line 46: | ||
<code bash> | <code bash> | ||
- | [osotolongo@brick03 medica]$ head anamnesi.db | + | [osotolongo@brick03 medica]$ head anamnesi.db |
Interno; | Interno; | ||
19960001; | 19960001; | ||
- | 19960003; | + | 19960003; |
- | 19960004; | + | 19960004; |
- | 19960006; | + | 19960006; |
19960008; | 19960008; | ||
19960009; | 19960009; | ||
Line 43: | Line 60: | ||
---- | ---- | ||
- | **Ojo aqui:** El comando //awk// selecciona lsolo las columnas que necesitamos. Esto incluye el //ID//, la fecha de cada visita y el texto libre que se scribe | + | **Ojo aqui:** El comando //awk// selecciona lsolo las columnas que necesitamos. Esto incluye el //ID//, la fecha de cada visita y el texto libre que se escribe |
---- | ---- | ||
Line 65: | Line 82: | ||
<code bash> | <code bash> | ||
- | [osotolongo@brick03 medicacion]$ awk -F";" | + | [osotolongo@brick03 medicacion]$ awk -F";" |
</ | </ | ||
Line 71: | Line 88: | ||
<code bash> | <code bash> | ||
- | [osotolongo@brick03 medica]$ head seguimientos.db | + | [osotolongo@brick03 medica]$ head seguimientos.db |
Interno; | Interno; | ||
19960014; | 19960014; | ||
- | 19960044; | + | 19960044; |
19960068; | 19960068; | ||
- | 19960171; | + | 19960171; |
- | 19960171; | + | 19960171; |
- | 19960171; | + | 19960171; |
- | 19960171; | + | 19960171; |
- | 19960171; | + | 19960171; |
- | 19960171; | + | 19960171; |
</ | </ | ||
Line 104: | Line 121: | ||
- Es muy sencillo insertar un envio de email al final del script | - Es muy sencillo insertar un envio de email al final del script | ||
- | **No medicamenteos:** Como la mayor parte de la limpieza la voy a hacer con expresiones regulares, voy a tomar el archivo // | + | **No medicamentos:** Como la mayor parte de la limpieza la voy a hacer con expresiones regulares, voy a tomar el archivo // |
<code bash> | <code bash> | ||
Line 110: | Line 127: | ||
</ | </ | ||
- | Ahora, este archivo lo necesito de input para el parser. Lo voy a convertir en un //array// y despues solo tengo que quitar estas palabras cada vez que las encuentre. O algo parecido. Asi que dentro del codigo | + | Ahora, este archivo lo necesito de input para el parser. Lo voy a convertir en un //array// y despues solo tengo que quitar estas palabras cada vez que las encuentre. O algo parecido. Asi que dentro del codigo |
<code perl> | <code perl> | ||
Line 170: | Line 187: | ||
</ | </ | ||
- | lo que me ha queado | + | lo que me ha quedado |
<code perl> | <code perl> | ||
Line 187: | Line 204: | ||
<code perl> | <code perl> | ||
- | my $repeat = 15; | + | my $repeat = 12; |
foreach my $med (sort keys %meds){ | foreach my $med (sort keys %meds){ | ||
if ($meds{$med} > $repeat){ push @medkw, $med; } | if ($meds{$med} > $repeat){ push @medkw, $med; } | ||
Line 234: | Line 251: | ||
</ | </ | ||
+ | **Ahora, las reglas han de revisarse y editarse a mano. Esto no hay manera de evitarlo pero solo ha de hacerse una vez. La proxima vez que se haga el analisis se usara el mismo archivo de reglas.** | ||
+ | |||
+ | ===== Reglas de CIMA ===== | ||
+ | |||
+ | https:// | ||
+ | |||
+ | Me bajo la lista de medicamentos comercializados en España y la convierto a CSV. Luego hago esto: | ||
+ | |||
+ | <code bash> | ||
+ | [osotolongo@brick03 medicaion_dev]$ awk -F";" | ||
+ | </ | ||
+ | |||
+ | O si quiero tener los principios activos, | ||
+ | |||
+ | <code bash> | ||
+ | [osotolongo@brick03 medicaion_dev]$ awk -F";" | ||
+ | [osotolongo@brick03 medicaion_dev]$ sed ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Aplicando las reglas ===== | ||
+ | |||
+ | Aqui he de leer tres cosas antes que nada. Primero, las reglas que hemos construido. Estas las voy a asignar a un hash de arrays, | ||
+ | |||
+ | <code perl> | ||
+ | my %wrules; | ||
+ | open RDF, "< | ||
+ | while (< | ||
+ | (my $rkey, my $rvalue) = /^(\w*): (.*)$/; | ||
+ | chomp $rvalue; | ||
+ | my @lpat = split /\|/, $rvalue; | ||
+ | %{$wrules{$rkey}} = map {$_ => 1} @lpat unless !$rkey; | ||
+ | } | ||
+ | close RDF; | ||
+ | |||
+ | </ | ||
+ | |||
+ | Luego, la lista de principios activos de [[https:// | ||
+ | |||
+ | <code perl> | ||
+ | my %cima; | ||
+ | open ADF, "< | ||
+ | while (< | ||
+ | my ($med, $pal, $pan) = / | ||
+ | my @pas = split /, /, $pal; | ||
+ | for (@pas) {s/ | ||
+ | $cima{$med} = [ @pas ]; | ||
+ | } | ||
+ | close ADF; | ||
+ | </ | ||
+ | |||
+ | |||
+ | Ahora cargo base de datos ya revisada, que si todo va bien sera el output del script anterior. | ||
+ | |||
+ | <code perl> | ||
+ | my $dbfile = ' | ||
+ | |||
+ | my %visits; | ||
+ | my %meds; | ||
+ | open IDF, "< | ||
+ | while(< | ||
+ | my ($pid, $vid, $ldata) = / | ||
+ | </ | ||
+ | |||
+ | Pero voy a ir llenando el hash de output (// %visits //) a medida que leo. Primero meto toda la medicacion de la visita en un array, | ||
+ | |||
+ | <code perl> | ||
+ | if($ldata){ | ||
+ | my @mlist = split /,/, $ldata; | ||
+ | </ | ||
+ | |||
+ | y ahora, para cada elemento de este array, recorro las reglas, buscando si este termino existe dentro de alguna regla. | ||
+ | |||
+ | <code perl> | ||
+ | foreach my $med (@mlist){ | ||
+ | if ($med){ | ||
+ | foreach my $rkey (sort keys %wrules){ | ||
+ | if(exists($wrules{$rkey}{$med})){ | ||
+ | foreach my $pa (@{$cima{$rkey}}){ | ||
+ | $meds{$pa} = 1; | ||
+ | $visits{$pid}{$vid}{$pa} = 1; | ||
+ | } | ||
+ | last; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Cuando encuentro este elemento en las reglas, marco tods los ID de principios activos correspondientes a este medicamento como existentes en esa visita y ademas los sumo a las variables que he de escribir. Si no se encuentra este termino, se concluye que no es ningun medicamento (pues no esta en ninguna regla) y no se hace nada. | ||
+ | |||
+ | Una vez llenados los medicamentos de cada visita hemos de escribirlo en forma matricial. Primero escribimos los headers, | ||
+ | |||
+ | <code perl> | ||
+ | open ODF, "> | ||
+ | print ODF " | ||
+ | foreach my $med (sort keys %meds){ | ||
+ | print ODF ", | ||
+ | } | ||
+ | print ODF " | ||
+ | </ | ||
+ | |||
+ | Y ahora llenamos los valores correspondientes a cada visita con un 1, caso de existir y un 0 en caso contrario. | ||
+ | |||
+ | <code perl> | ||
+ | foreach my $pid (sort keys %visits){ | ||
+ | foreach my $vid (sort keys %{$visits{$pid}}){ | ||
+ | print ODF " | ||
+ | foreach my $med (sort keys %meds){ | ||
+ | if(exists($visits{$pid}{$vid}{$med})){ | ||
+ | print ODF ", | ||
+ | }else{ | ||
+ | print ODF ", | ||
+ | } | ||
+ | } | ||
+ | print ODF " | ||
+ | } | ||
+ | } | ||
+ | close ODF; | ||
+ | </ | ||
+ | |||
+ | **TADA!** | ||