MySQL 程序 : substring_index throwing exception from special characters (executed in bash)

标签 mysql sql bash unix special-characters

所以让整个问题变得困难的是我在 bash shell 环境中工作。我正在解析大量数据,这些数据都位于一组目录中的文本文件中。我工作的环境没有gui,只有shell,我通过mysql从shell执行命令,我没有登录mysql。

我是一个项目的合作伙伴,主要部分是一个 bash 脚本,用于搜索信息并将其插入到多个目录中的文本文件中。我的操作解析出所需的数据并将其插入数据库。

我通过 shell 脚本运行我的主循环。它遍历一组目录并在每个目录中搜索 .txt 文件。然后我将信息传递给我的程序。在类似下面的内容中。

注意:我不是 bash 方面的专家并且刚刚开始学习。

mysql - user -p'mypassword' --database=dbname <<EFO
call Procedure_Name("`cat ${textfile}`");
EOF

因为我只在 mysql 和 bash 中工作,所以我不能使用其他语言来让我的生活更轻松,所以我主要使用 SUBSTRING_INDEX。因此,该过程的图示如下所示。

DELIMITER $$
CREATE PROCEDURE Procedure_name(textfile LONGTEXT)
BEGIN
    DECLARE data LONGTEXT;
    SET data = SUBSTRING_INDEX(SUBSTRING_INDEX(textfile,"(+++)",1),"(++)",-1));
    INSERT INTO Table_Name (column) values (data);
END; $$
DELIMITER ;

文本文件是一个干净的结构,允许我将其剪切,但我遇到的问题是文本文件中的特殊字符导致我的程序抛出错误。我相信他们是转义角色,我需要解决这个问题的方法。几乎任何字符都可能出现在我正在解析的数据中,因此我需要一种方法来忽略过程中的这些字符或使它们不影响我的过程。

我试着查看 mysql_real_escape_string() 但是参数很难弄清楚,看起来它只适用于 PHP,但我不确定。所以我想在我的程序开始时做一些事情,可能会在字符串中插入“\”或其他东西,以免导致我的程序失败。

另外,这些文本文件的大小从 16k 到 11000k 不等,所以我需要一些可以处理的东西。我的过程有时会起作用,但会遇到很多问题,而且我的搜索对我一点帮助也没有。所以任何帮助将不胜感激!!!

感谢所有阅读这篇长篇描述的人。通常我可以找到我的答案或从问题中拼凑出来,但这次我运气不好,所以我想是时候做一个帐户并提出一些问题了。

最佳答案

你的问题实在是太笼统了,不过这里有一个例子可以说明我的意思

  a script file:

  #!/bin/bash

  case $# in
     1 ) inFile=$1 ;;
     * ) echo "usage: myLoader infile"; exit 1 ;;
  esac 

  awk 'BEGIN {
    FS="\t"'; OFS="|"
  } 
  {
     sub(/badChars/, "", $0); sub(/otherBads/, "", $0) ; # .... as many as needed
     # but be careful, easy to delete stuff that with too broad a brush.
     print $1, $2, $5, $4, $9
  }' $inFile > $inFile.psv

  bcp -in -f ${formatFile:-formatFile} $inFile.psv

请注意 awk 如何通过重复 sub(...) 命令来删除源数据中可能包含的任何“坏字符”并重新组织列的顺序,从而使它变得非常简单你的数据。每个 $n 都是一行中编号列中的值,因此 $1, $2, $5 会跳过字段 $3 和 $4,例如。

OFS 设置为管道字符,可以很容易地在输出中查看字段边界的确切位置,以及是否有任何前导或尾随空白字符可能会影响您的负载。

> $inFile.psv 保留您的原始文件,以防万一您在 awk 脚本中出错。 如果您创建非常小的测试数据文件,则可以不保存到文件,只需让输出显示在屏幕上,编辑直到正确为止。

您必须弄清楚 mySQL 的 bcp 等效项是如何工作的。我很确定我在这里看到过帖子。要么,要么发布一个单独的问题,“我有这个 8 列的管道分隔文件,我如何将它加载到我的表中?”。

我的示例代码中对 ${formatFile} 的引用是希望 mySQL bcp 命令可以采用格式文件,该格式文件指定要加载到文件中的字段的顺序和类型。良好的 bcp fmt 文件允许相当大的灵 active ,但您必须阅读该实用程序的手册页并进行一些研究以了解该灵 active 的范围和限制。

接下来,您应该发布个别问题,例如“我已经尝试过使用 lang Y 过滤 Z 字符的 x。现在我得到输出 z,我做错了什么?”

分而治之。没有简单的方法。重新设定那些客户和老板的期望,你正在学习一些新东西,需要一点点研究才能把它做好。祝你好运。

健康教育

关于MySQL 程序 : substring_index throwing exception from special characters (executed in bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137325/

相关文章:

php - 为每条记录仅获取mysql中的最新数据

mysql - SQL - 内部联接以排除行

linux - 如何导出计算节点的路径,并行编程

linux - $(find -X) 等价于 linux

php - 使用 Linux 服务器 shell 命令按计划运行 php 脚本

MySQL 全文搜索 1 个字符仅适用于 MyISAM?

php - 如何查询,加入表,字段可以使用 Laravel 从字段 A 或 B 获取值

php - 如何在 Live Server 中上传大于 50MB 的数据库?

mysql - 按日期订购 2 张 table

mysql - 当提供的值不是空字符串时更新 MariaDB 列