{"id":408,"date":"2008-10-06T18:58:38","date_gmt":"2008-10-06T17:58:38","guid":{"rendered":"http:\/\/www.tiendadeultramarinos.es\/?p=408"},"modified":"2008-10-06T18:58:38","modified_gmt":"2008-10-06T17:58:38","slug":"java-problemas-de-contrabarra","status":"publish","type":"post","link":"https:\/\/www.tiendadeultramarinos.es\/?p=408","title":{"rendered":"Java: Problemas de contrabarra"},"content":{"rendered":"<p>Para el Proyecto tengo que hacer unas llamadas a <a href=\"http:\/\/www.r-project.org\/\">R<\/a>, el programa de an\u00e1lisis estad\u00edsticos, desde Java. Uno de los comandos que le ordeno es que lea un fichero de texto CSV donde se encuentran las entradas y salidas. En R, simplemente:<\/p>\n<p><code>basedatos&lt;-read.table(\"\/home\/ender\/iris.csv\",sep=\";\",header=TRUE,dec=\",\") <\/code><\/p><a name=\"teMiddle807268910\"><\/a><div class=\"te_div\" id=\"te807268910\">\n<p>Para lanzarlo desde Java, ser\u00eda (JFileChooser explorador, String sep=\u00bb;\u00bb, String dec=\u00bb,\u00bb):<\/p>\n<p><code>re.eval(\"basedatos&lt;-read.table(\\\"\" + explorador.getFile().getAbsolutePath() + \"\\\",sep=\\\"\" + sep + \"\\\",header=TRUE,dec=\\\"\" + dec + \"\\\")\");<\/code><\/p>\n<p>He estado todo este tiempo programando desde Linux y no hab\u00eda tenido ning\u00fan problema, pero dado que Java es multiplataforma, me dediqu\u00e9 ayer a preparar el resto de programas (R y JRI, la librer\u00eda que permite la comunicaci\u00f3n mediante JNI desde Java) para poder usarlo desde Windows. Y el caso es que me daba error.<\/p>\n<p>Imagin\u00e9 en seguida que ser\u00eda problema de las rutas y, efectivamente, R no acepta las direcciones con la contrabarra, tal y como se dan en Windows. Para solucionarlo, obviamente, no hay mas que cambiar todas las contrabarras por barras, para lo cual hay un comando que implementa todo String:<\/p>\n<p><code>path = path.replaceAll(\"\\\\\",\"\/\");<\/code><\/p>\n<p>Recordemos que la contrabarra es utilizado como car\u00e1cter de escape para caracteres que no tienen representaci\u00f3n gr\u00e1fica (intro, tabulado, etc\u00e9tera) de modo que hay que \u00abescaparla\u00bb poniendola dos veces. Pues no funciona. Por alg\u00fan motivo Java no lo reconoce como String, sin embargo existe otro m\u00e9todo para caracteres con el que funciona correctamente.<\/p>\n<p><code>path = path.replace('\\\\','\/'));<\/code><\/p>\n<p>He hecho un par de pruebas y no s\u00e9 qu\u00e9 miedo le tiene a las contrabarras como String, porque algo como:<br \/>\n<code><br \/>\nString aux = \"albaricoque\/gemir\/susurro\/sociedad\";<br \/>\nSystem.out.println(aux.replaceAll(\"\/\",\".\"));<br \/>\naux = \"albaricoque\\\\gemir\\\\susurro\\\\sociedad\";<br \/>\nSystem.out.println(aux);<br \/>\nSystem.out.println(aux.replaceAll(\"\\\\s\",\".\"));<br \/>\nSystem.out.println(aux.replace('\\\\',','));<br \/>\nSystem.out.println(aux.replaceAll(\"\\\\\",\",\"));<br \/>\n<\/code><br \/>\nDevuelve por pantalla:<br \/>\n<code><br \/>\nalbaricoque.gemir.susurro.<br \/>\nalbaricoque\\gemir\\susurro\\sociedad<br \/>\nalbaricoque\\gemir\\susurro\\sociedad<br \/>\nalbaricoque,gemir,susurro,sociedad<br \/>\nException in thread \"main\" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1<br \/>\n\\<br \/>\n^<br \/>\n<\/code><\/p>\n<p>Aqu\u00ed se ve que la barra como String es reconocida sin problemas, pero no la contrabarra, que de hecho lanza una expcepci\u00f3n. He pensado que al ser un car\u00e1cter de control pueda no funcionar correctamente s\u00f3lo, por lo que he probado que modifique las <code>\\s<\/code> por puntos, pero no cambia nada.<\/p>\n<p>Echando un vistazo en Google,<a href=\"http:\/\/forums.sun.com\/thread.jspa?threadID=644389&amp;messageID=3796580\"> en un foro dan una soluci\u00f3n<\/a>, pero no entiendo por qu\u00e9 hay que codificarlo as\u00ed:<br \/>\n<code>System.out.println(aux.replaceAll(\"\\\\\\\\\",\".\"));<\/code><br \/>\n<code>albaricoque.gemir.susurro.sociedad<\/code><\/p>\n<p>\u00a1Cuatro barras para que encuentre una!<\/p>\n<\/div><p style=\"text-align: center;\"><a style=\"display:none;\" class=\"theTag\" id=\"te807268910\" onClick=\"expand('#te807268910');\" href=\"#teMiddle807268910\"><\/a><\/p><script language=\"JavaScript\" type=\"text\/javascript\">expander_hide('#te807268910');<\/script>","protected":false},"excerpt":{"rendered":"<p>Para el Proyecto tengo que hacer unas llamadas a R, el programa de an\u00e1lisis estad\u00edsticos, desde Java. Uno de los comandos que le ordeno es que lea un fichero de texto CSV donde se encuentran las entradas y salidas. En R, simplemente: basedatos&lt;-read.table(\u00ab\/home\/ender\/iris.csv\u00bb,sep=\u00bb;\u00bb,header=TRUE,dec=\u00bb,\u00bb) Para lanzarlo desde Java, ser\u00eda (JFileChooser explorador, String sep=\u00bb;\u00bb, String dec=\u00bb,\u00bb): re.eval(\u00abbasedatos&lt;-read.table(\\\u00bb\u00bb &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.tiendadeultramarinos.es\/?p=408\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u00abJava: Problemas de contrabarra\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[313,87,297,312,315,311,314],"class_list":["post-408","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-archivos","tag-java","tag-linux","tag-r","tag-replaceall","tag-string","tag-windows","entry"],"_links":{"self":[{"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=\/wp\/v2\/posts\/408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=408"}],"version-history":[{"count":0,"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=\/wp\/v2\/posts\/408\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiendadeultramarinos.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}