2

OSX の Automator を使用して、Excel ドキュメントを MySQL データベース テーブルに自動的にアップロードする Perl スクリプトを作成しています。私はすでに関数クエリを書いています:

load data
local infile '/pathToFile/file.csv'
replace into table database.table
fields terminated by ','
enclosed by '"'
lines terminated by '\r'
ignore 1 lines;

\問題は、キャラクターと競合するため、Perl スクリプトが機能していないことです。私は一種の Perl 初心者なので、この文字を正しくエスケープしてクエリを機能させる方法がわかりません。

私のPerlスクリプト:

#!/usr/bin/perl

# PERL MODULE
use Mysql;

# HTTP HEADER
print "Content-type: text/html \n\n";

# Set Variables
$host = "127.0.0.1";
$database = "database";
$tablename = "plugin_status";
$user = "user";
$pw = "password";

# PERL MySQL Connector
$connect = Mysql->connect($host, $database, $user, $pw);

# Run Query to update table
$myquery = "load data local infile '/pathToFile/file.csv' replace into table database.table fields terminated by ',' enclosed by '"' lines terminated by '\r' ignore 1 lines;";

# EXECUTE THE QUERY FUNCTION
$execute = $connect->query($myquery);

生成されたエラーは次のとおりです。

String found where operator expected at perlfile.pl line 20, near ""load data local infile '/pathToFile/file.csv' replace into table database.table fields terminated by ',' enclosed by '"' lines terminated by '"
    (Missing operator before ' lines terminated by '?)
Backslash found where operator expected at perlfile.pl line 20, near "' lines terminated by '\"
    (Missing operator before \?)
syntax error at perlfile.pl line 20, near ""load data local infile '/pathToFile/file.csv' replace into table database.table fields terminated by ',' enclosed by '"' lines terminated by '"
Bad name after r' at perlfile.pl line 20.
4

3 に答える 3

9

結果の文字列に 2 バイト シーケンスを含めたい場合は\r、文字列を中間でラップするときにバックスラッシュをエスケープする必要があります"

"また、文字列の内容をラップするために使用する場合、文字列にfree を含めることはできないことに注意"してください。この場合、"文字列の一部にしたいすべてをエスケープする必要があります。以下の例を参照してください。

my $data = "hello, I can write \"quotes\" inside my string";

ただし、何かをエスケープすることを心配する必要がないように、はるかに単純な代替手段があります1

$myquery = q{
  load data local infile '/pathToFile/file.csv'
  replace into table database.table
  fields
    terminated by ','
    enclosed by '"'
    lines terminated by '\r'
  ignore 1 lines;
};

1.文字列で使用する予定がない限り}..


文字列とエスケープ シーケンスの詳細については、こちらをご覧ください。

于 2012-07-16T00:23:58.963 に答える
4

まず、あなたは本当にする必要がuse strict;ありuse warnings;ます。例外なし!ともかく:

…enclosed by '"'…

refpで指摘されているように、perlはそこで二重引用符で囲まれた文字列の解析を停止します。その二重引用符を円記号で置き換えるか、二重引用符の代わりにq{}またはヒアドキュメントでラップすることをお勧めします。

#!/usr/bin/perl
use strict;
use warnings;

# this
my $query = q{
  load data local infile '/pathToFile/file.csv'
    replace into table database.table
      fields terminated by ','
      enclosed by '"'
      lines terminated by '\r'
      ignore 1 lines;
};
# or this
my $query = <<'SQL';
  load data local infile '/pathToFile/file.csv'
    replace into table database.table
      fields terminated by ','
      enclosed by '"'
      lines terminated by '\r'
      ignore 1 lines;
SQL
于 2012-07-16T00:45:45.577 に答える