1

したがって、この質問全体を難しくしているのは、私が bash シェル環境で作業していることです。ディレクトリ セット内のテキスト ファイルにある大量のデータを解析しています。私が作業している環境にはGUIがなく、単なるシェルであり、mysqlを介してシェルからコマンドを実行しています.mysqlにログインしていません。

私はプロジェクトのパートナーです。主な部分は、情報を検索して複数のディレクトリのテキスト ファイルに挿入する bash スクリプトです。私の操作では、必要なデータを解析してデータベースに挿入します。

シェル スクリプトを使用してメイン ループを実行します。一連のディレクトリをループし、それぞれの .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

sub(...)コマンドを繰り返してソースデータにある可能性のある「不良文字」を削除し、データ内の列の順序を再編成することにより、awk が非常に簡単になることに注意してください。それぞれ$nが行の番号付き列の値である$1, $2, $5ため、たとえばフィールド $3 と $4 をスキップします。

OFS はパイプ char に設定されているため、フィールド境界が正確にどこにあるのか、負荷を軽減する可能性のある先頭または末尾の空白文字があるかどうかを出力で簡単に確認できます。

> $inFile.psvawk スクリプトを間違えた場合に備えて、 は元のファイルを保持します。非常に小さいテスト データ ファイルを作成する場合は、ファイルへの保存を省略し、出力を画面に表示して、正しく表示されるまで編集することができます。

mySQL の bcp に相当するものがどのように機能するかを正確に知る必要があります。私はここの投稿を見たことがあると確信しています。それか、別の質問を投稿してください。

私のサンプル コードでの参照は、${formatFile}ファイルにロードされるフィールドの順序とタイプを指定するフォーマット ファイルを mySQL bcp コマンドが取得できることを願っています。優れた bcp fmt ファイルはかなりの柔軟性を備えていますが、そのユーティリティのマニュアル ページを読んで、その柔軟性の範囲と制限を理解するために調査を行う必要があります。

今後は、「lang Y を使用して Z 文字をフィルター処理するために x を試しました。現在、出力 z を取得しています。何が間違っているのですか?」などの個別の質問を投稿する必要があります。

分割統治。簡単な方法はありません。顧客や上司の期待をリセットすることで、何か新しいことを学んでいます。それを正しく理解するには少し勉強が必要です。幸運を。

IHTH

于 2013-08-09T00:29:40.583 に答える