This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
medicacion2021 [2021/03/28 13:44] osotolongo [Limpieza] |
medicacion2021 [2021/04/03 10:42] (current) osotolongo [tl;dr] |
||
---|---|---|---|
Line 2: | Line 2: | ||
Ver programas en github: https:// | 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 235: | 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!** | ||