Advertisement
bvn13

Untitled

May 13th, 2013
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use utf8;
  7. use Encode;
  8.  
  9. use FindBin;
  10. BEGIN { unshift @INC, "$FindBin::Bin/lib" }
  11.  
  12. use NCRB::FileStructure;
  13. use NCRB::FileParser;
  14.  
  15. use DBI;
  16. use Digest;#::MD5 qw/md5_hex/;
  17.  
  18. use Data::Dumper;
  19.  
  20. binmode STDOUT, ':utf8';
  21.  
  22. my $dbh = DBI->connect('dbi:Firebird:db=/srv/firebird/MAINBASE.FDB;ib_charset=WIN1251', 'sysdba', 'masterkey');
  23. die $dbh->errstr if $dbh->errstr;
  24. print "Database connected!\n";
  25.  
  26. sub trim($)
  27. {
  28. my $string = shift;
  29. $string =~ s/^\s+//;
  30. $string =~ s/\s+$//;
  31. return $string;
  32. }
  33.  
  34. sub genID($$) {
  35. my $prefix = shift;
  36. my $string = shift;
  37. my $crc = Digest->new('SHA-1');
  38. $crc->add($string);
  39.  
  40. return "$prefix" . $crc->hexdigest; #md5_hex($string);
  41. }
  42.  
  43. sub cnv($) {
  44. my $string = shift;
  45. return encode('cp1251', $string);
  46. }
  47.  
  48. sub saveBlock {
  49. my $data = shift;
  50.  
  51. for (my $strId=0; $strId<scalar(@$data); $strId++) {
  52. my $strType = shift @{$data->[$strId]};
  53. if ($strType eq 'P') {
  54. print "Saving string P...\n";
  55. print Dumper $data->[$strId];
  56. save_P($data->[$strId]);
  57. exit;
  58. } elsif ($strType eq 'C') {
  59.  
  60. } elsif ($strType eq 'O') {
  61.  
  62. } elsif ($strType eq 'M') {
  63.  
  64. } elsif ($strType eq 'I') {
  65.  
  66. }
  67. }
  68. }
  69.  
  70. sub save_P {
  71. my $str = shift;
  72. $dbh->{AutoCommit} = 1;
  73.  
  74. # my $sel_q = <<EOQ;
  75. #
  76. # SELECT ID FROM REF_PATIENTS
  77. # WHERE (TITLE = ?)
  78. # OR (
  79. # FAM = ?
  80. # AND IM = ?
  81. # AND OT = ?
  82. # );
  83. #
  84. #EOQ
  85.  
  86. my $ins_q = <<EOQ;
  87.  
  88. INSERT INTO REF_PATIENTS(ID, CODE, TITLE, FAM, IM, OT, SEX, BIRTHDAY, SNILS)
  89. VALUES (gen_id(GEN_REF_PATIENTS_CODE,1),?,?,?,?,?,?,?,?)
  90. RETURNING ID;
  91.  
  92. EOQ
  93.  
  94. my $sel_q = "SELECT ID FROM REF_PATIENTS"
  95. . " WHERE (TITLE = '$str->[2] $str->[3] $str->[4]')"
  96. . " OR ("
  97. . " FAM = '$str->[2]'"
  98. . " AND IM = '$str->[3]'"
  99. . " AND OT = '$str->[4]'"
  100. . ");"
  101. ;
  102. print "$sel_q\n";
  103. my $sth_s = $dbh->prepare(cnv($sel_q));
  104. #$sth_s->bind_param(1, cnv("$str->[2] $str->[3] $str->[4]"));
  105. #$sth_s->bind_param(2, cnv($str->[2]));
  106. #$sth_s->bind_param(3, cnv($str->[3]));
  107. #$sth_s->bind_param(4, cnv($str->[4]));
  108. $sth_s->execute or die "ERROR: Failed to find record! $!";
  109.  
  110. print "Sex orig: $str->[5]\n";
  111. my $sex = ($str->[5] eq 'М' ? 'Муж.' :
  112. ($str->[5] eq 'Ж' ? 'Жен.' :
  113. undef
  114. )
  115. );
  116. print "Sex: $sex\n";
  117.  
  118. if ($sth_s->rows == 0) {
  119. #not found
  120. print "Not found. Creating a new record.\n";
  121. #my $sth_i = $dbh->prepare($ins_q);
  122. #$sth_i->execute(
  123. # cnv($str->[0]),
  124. # cnv("$str->[2] $str->[3] $str->[4]"),
  125. # cnv($str->[2]),
  126. # cnv($str->[3]),
  127. # cnv($str->[4]),
  128. # cnv($sex),
  129. # cnv($str->[6]),
  130. # cnv($str->[8])
  131. #) or die 'ERROR!';
  132. #$dbh->commit;
  133. print "TITLE: $str->[2] $str->[3] $str->[4]\n";
  134. my $ins_q_1 = "INSERT INTO REF_PATIENTS(ID, CODE, TITLE, FAM, IM, OT, SEX, BIRTHDAY, SNILS) "
  135. . " VALUES("
  136. . "gen_id(GEN_REF_PATIENTS_CODE, 1),"
  137. . "'" . trim($str->[0]). "',"
  138. . "'" . "$str->[2] $str->[3] $str->[4]". "',"
  139. . "'" . $str->[2]. "',"
  140. . "'" . $str->[3]. "',"
  141. . "'" . $str->[4]. "',"
  142. . "'" . $sex. "',"
  143. . "'" . $str->[6]. "',"
  144. . "'" . $str->[8]. "'"
  145. . ")"
  146. . " RETURNING ID;"
  147. ;
  148. print "QUERY: $ins_q_1\n";
  149. my $sth_i = $dbh->prepare(cnv($ins_q_1));
  150. $sth_i->execute or die 'ERROR!';
  151. #$sth_i->commit;
  152. print "ID: " . $sth_i->fetchrow_arrayref->[0] . "\n\n";
  153. print "Done.\n";
  154. } elsif ($sth_s->rows > 1) {
  155. while (my $row = $sth_s->fetchrow_arrayref) {
  156. print Dumper $row;
  157. }
  158. die "ERROR! Found " . $sth_s->rows . " for\n $str\n\n";
  159. } elsif ($sth_s->rows == 1) {
  160. return $sth_s->fetchrow->arrayref->[0];
  161. } else {
  162. die "ERROR! Select returned code: " . $sth_s->rows . "\n";
  163. }
  164. }
  165.  
  166. sub main {
  167.  
  168. my $proto = NCRB::FileStructure->new->init;
  169. #$proto->addDataString('L', 'Характеристика учреждения', '1', 1, '8', 'Код Учреждения по ОКПО', 'L', 1, 'C', 8, 0);
  170.  
  171. #print Dumper $proto;
  172.  
  173. my $parser = NCRB::FileParser->new(file => '36825093.txt', proto => $proto);
  174. print "Parsing data...\n\n";
  175. $parser->parse;
  176. #print Dumper $parser->getData;
  177.  
  178. #print Dumper $parser->getData->[0];
  179. #exit;
  180.  
  181. for (my $blockId=0; $blockId < scalar (@{$parser->getData}); $blockId++) {
  182. saveBlock($parser->getData->[$blockId]);
  183. #for (my $stringId=0; $stringId < scalar (@{$parser->getData->[$blockId]}); $stringId++) {
  184. # saveString($parser->getData->[$blockId]->[$stringId]
  185. # my $strType = $parser->getData->[$blockId]->[$stringId]->[0];
  186. # for (my $fieldId=0; $fieldId < scalar(@{$parser->getData->[$blockId]->[$stringId]}); $fieldId++) {
  187. # #Encode::_utf8_off($parser->getData->[$a]->[$b]);
  188. # print "".$parser->getData->[$blockId]->[$stringId]->[$fieldId]."#";
  189. # }
  190. # print "\n";
  191. #}
  192. }
  193.  
  194. }
  195.  
  196.  
  197. main;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement