1

所以让整个问题变得困难的是我在 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,所以我需要一些可以处理的东西。我的过程有时会起作用,但会遇到很多事情,而我的搜索根本没有帮助我。所以任何帮助将不胜感激!!!

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

4

1 回答 1

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 设置为管道字符,以便在输出中轻松查看字段边界的确切位置以及是否有任何前导或尾随空白字符可能会导致您的负载丢失。

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

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

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

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

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

IHTH

于 2013-08-09T00:29:40.583 回答