MySQL程序:substring_index从特殊字符抛出异常(在bash中执行)

时间:2013-08-08 22:33:23

标签: 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所以我需要一些可以处理它的东西。我的过程有时会起作用,但却被很多东西所吸引,而我的搜索根本没有帮助我。所以任何帮助将不胜感激!!!

感谢所有人阅读这篇长篇描述。通常情况下,我可以从问题中找到我的答案或者将它拼凑在一起,但这次我没有运气,所以我认为是时候开个帐户并问一些问题。

1 个答案:

答案 0 :(得分:0)

你的问题实在太过分了,但这是我的意思的一个例子

  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被设置为管道字符,使得在输出中很容易看到字段边界是否是AND,如果有任何前导或尾随空白字符可能会丢失负载。

> $inFile.psv保留原始文件,以防您在awk脚本中出错。 如果你创建了非常小的测试数据文件,你可以省去保存到文件,只需让输出进入屏幕,编辑直到你做对了。

你必须弄清楚mySQL相当于bcp的工作原理。我很确定我在这里发过帖子。要么是这样,要么发一个单独的问题,“我有这个带有8列的管道分隔文件,如何将它加载到我的表中?”。

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

展望未来,你应该发布个别问题,比如“我尝试使用lang Y过滤Z字符。现在我得到输出z,我做错了什么?”

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

IHTH