{"id":417,"date":"2021-12-02T01:27:48","date_gmt":"2021-12-02T01:27:48","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=417"},"modified":"2021-12-02T01:35:04","modified_gmt":"2021-12-02T01:35:04","slug":"php-script-transformando-linhas-de-um-arquivo-em-clausula-sql-in","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/12\/02\/php-script-transformando-linhas-de-um-arquivo-em-clausula-sql-in\/","title":{"rendered":"PHP Script Transformando Linhas de um Arquivo em Cl\u00e1usula SQL IN"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">php process-file-lines-into-sql-in-clause.php --filename=original-file-with-ids-extracted-from-spreadsheet-column --quotes=none --split=1000<\/pre>\n\n\n\n<p>Acima a sintaxe de como invocar o script, abaixo o script ele mesmo.<\/p>\n\n\n\n<pre id=\"block-a253ca57-f114-4511-b2dd-393b34346b0f\" class=\"wp-block-preformatted\">&lt;?php\nconst HINT_FILENAME = \"php process-file-lines-into-sql-in-clause.php --filename=my-text-file-name.txt\";\nconst HINT_QUOTES = HINT_FILENAME . \" --quotes=double|single|none\";\nconst HINT_SPLIT = HINT_QUOTES . \" --split=1000|none\";\n\n$options = getopt(null, [\"filename:\",\"quotes:\",\"split:\"]);\n\n(!array_key_exists('filename',$options))\n    ? die(\"\\n*** Missing argument --filename *** ... sample of usage:\\n\\n\" . HINT_FILENAME . \"\\n\\n\")\n    : null;\n\n(!array_key_exists('quotes',$options))\n    ? die(\"\\n*** Missing argument --quotes *** ... sample of usage:\\n\\n\" . HINT_QUOTES . \"\\n\\n\")\n    : null;\n\n(!array_key_exists('split',$options))\n    ? die(\"\\n*** Missing argument --split *** ... sample of usage:\\n\\n\" . HINT_SPLIT . \"\\n\\n\")\n    : null;\n\n$filename = $options['filename'];\n$quotes = $options['quotes'];\n$split = $options['split'];\n\nswitch ($quotes) {\n  case \"double\":\n    $quotes = '\"';\n    break;\n  case \"single\":\n    $quotes = \"'\";\n    break;\n  case \"none\":\n  default:\n    $quotes = \"\";\n}\n\n$filename_original_renamed = date('Ymd') . '-source-' . $filename;\n$file_content_rows = file($filename, FILE_IGNORE_NEW_LINES);\n\n$split = is_numeric($split) ? (int)$split : count($file_content_rows);\n$chunks = array_chunk($file_content_rows, $split);\n\necho \"\\n\\nYour file lines are being processed and converted to a string of SQL IN clause\";\necho \"\\nTotal Rows=\" . count($file_content_rows);\necho \"\\n\";\n\n$glue = (empty($quotes)) ? ',' : $quotes . ',' . $quotes;\n\nforeach ($chunks as $chunk => $chunk_rows) {\n    $chunk_label = count($chunks) > 1 ? '-chunk-' . str_pad($chunk+1, 3, '0', STR_PAD_LEFT) : '-lines-' . $split;\n    $filename_processed_renamed = date('Ymd') . '-processed-' . $filename . $chunk_label;\n    $stringifyEmails = $quotes . implode($glue, $chunk_rows) . $quotes;\n    file_put_contents($filename_processed_renamed, $stringifyEmails);\n\n    echo \"\\nFile content processed and save onto a renamed file... \" . $filename_processed_renamed;\n}\n\nrename($filename, $filename_original_renamed);\n\necho \"\\n\\nYour original source file has been renamed to... \" . $filename_original_renamed;\necho \"\\n\\n\";\n<\/pre>\n\n\n\n<p>Pessoal sem delongas&#8230; Sabem quando voc\u00ea tem aquela planilha lotada de IDs que passaram pra voc\u00ea fazer um SQL?<\/p>\n\n\n\n<p>Pois \u00e9, at\u00e9 d\u00e1 pra formatar na m\u00e3o os IDs como sendo uma lista separadas por v\u00edrgulas e eventualmente recobertos por aspas ou algo assim.<\/p>\n\n\n\n<p>Mas e se a planilha tiver 100.000 linhas ou mais? E se o SQL que voc\u00ea precisa rodar for na verdade um DML? E se voc\u00ea precisar executar as a\u00e7\u00f5es em volumes menores pra n\u00e3o sobrecarregar o servidor? H\u00e3?<\/p>\n\n\n\n<p>Pra isso eu desenvolvi este super script <em>Tabajara<\/em> que resolve o seu problema, veja que legal o pocesso.<\/p>\n\n\n\n<p>Passo 1) copie e cole a coluna de IDs num arquivo texto tipo <strong>Brackets<\/strong>, <strong>Notepad++<\/strong>, <strong>VI<\/strong> ou outro editor qualquer de sua prefer\u00eancia, e salve no disco.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1140178\n1141171\n1166736\n1177320\n1193872\n1212530<\/pre>\n\n\n\n<p>Passo 2) execute o script conforme demonstrado no primeiro bloco deste artigo, logo vou explicar as op\u00e7\u00f5es.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><meta charset=\"utf-8\">php process-file-lines-into-sql-in-clause.php --filename=original-file-with-ids-extracted-from-spreadsheet-column --quotes=none --split=none<\/pre>\n\n\n\n<p>Passo 3) colete no pr\u00f3prio diret\u00f3rio os arquivos processados com conte\u00fado no formato SQL IN.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1140178,1141171,1166736,1177320,1193872,1212530<\/pre>\n\n\n\n<p>Passo 4) se precisar, colete seu arquivo original que foi renomeado com o termo &#8220;<em>source<\/em>&#8220;.<\/p>\n\n\n\n<p>Explicando as op\u00e7\u00f5es do <strong>Script<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8212;<strong>filename<\/strong> nome do arquivo fonte contendo os respectivos elementos, sempre 1 por linha<\/li><li>&#8212;<strong>quotes<\/strong> deve ser informado um valor entre double|single|none para que elemento seja recoberto por aspas no caso de ser uma string<\/li><li>&#8212;<strong>split<\/strong> deve ser informado um valor inteiro com a quantidade de registros m\u00e1ximos a serem gerados no arquivo processado. No caso ser\u00e3o gerados tantos arquivos quanto necess\u00e1rio que ser\u00e3o separados como <strong>chunks<\/strong>, contendo sempre a quantidade m\u00e1xima exceto o \u00faltimo que poder\u00e1 conter um volume menor.<\/li><\/ul>\n\n\n\n<p>Pronto, voc\u00ea est\u00e1 pronto para copiar a string com os IDs para serem inseridos numa cl\u00e1usula SQL IN. Fique sabendo tamb\u00e9m que exatamente a mesma formata\u00e7\u00e3o para lista do <strong>SQL IN<\/strong> serve para criar um array no PHP, basta recobrir com <strong>squared<\/strong> <strong>brackets<\/strong> [] ao inv\u00e9s de <strong>brackets<\/strong> ().<\/p>\n\n\n\n<p>Pra finalizar quero citar que o mesmo resultado pode ser alcan\u00e7ado com editores de texto ou <strong>IDEs<\/strong> com o aux\u00edlio do mouse e bastante paci\u00eancia.<\/p>\n\n\n\n<p>Eu tamb\u00e9m sei que d\u00e1 pra fazer isso com o editor de texto <strong>VI<\/strong> usando macro substitui\u00e7\u00f5es, mas eu nunca fiz e n\u00e3o sei fazer, mas eu sei quem sabe!<\/p>\n\n\n\n<p>Mas isso \u00e9 assunto para outro artigo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>php process-file-lines-into-sql-in-clause.php &#8211;filename=original-file-with-ids-extracted-from-spreadsheet-column &#8211;quotes=none &#8211;split=1000 Acima a sintaxe de como invocar o script, abaixo o script ele mesmo. &lt;?php const HINT_FILENAME = &#8220;php process-file-lines-into-sql-in-clause.php &#8211;filename=my-text-file-name.txt&#8221;; const HINT_QUOTES = HINT_FILENAME . &#8221; &#8211;quotes=double|single|none&#8221;; const HINT_SPLIT = HINT_QUOTES . &#8221; &#8211;split=1000|none&#8221;; $options = getopt(null, [&#8220;filename:&#8221;,&#8221;quotes:&#8221;,&#8221;split:&#8221;]); (!array_key_exists(&#8216;filename&#8217;,$options)) ? die(&#8220;\\n*** Missing argument &#8211;filename *** &#8230; sample of usage:\\n\\n&#8221; . [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,2,3],"tags":[181,180,182,183],"class_list":["post-417","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-array_chunk","tag-file","tag-file_put_contents","tag-implode"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=417"}],"version-history":[{"count":2,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/417\/revisions"}],"predecessor-version":[{"id":420,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/417\/revisions\/420"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}