5

load data infile を使用する場合、コンマを含むフィールドをどのように処理しますか? 私はこのクエリを持っています:

$sql = "LOAD DATA LOCAL INFILE '{$file}' INTO TABLE sales_per_pgs 
        FIELDS TERMINATED BY ','
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES
        (@user_id, @account_code, @pg_code, @sales_value)
        SET
        user_id = @user_id, 
        account_code = @account_code,
        product_group_code = @pg_code,
        sales_value = REPLACE(@sales_value, ',', ''),
        company_id = {$company_id},
        year = {$year},
        month = {$month}";

csv の行は次のようになります。

139, pg89898, op89890, 1,000,000.00

1,000,000.00売上高です。

現在、私のデータベースに挿入されているのは のみ"1です。

編集

ユーザーは、次のような列を含むフォームをダウンロードします。

user idaccount idpg idsales value

最初の 3 つの列user idaccount idpg idが入力さsales valueれ、ユーザーが手動で入力する必要があるため、列は空白です... ユーザーは MS Excel を使用してそれを行います...

フォームが完成したら、彼はそれをアップロードします。その中で私はload data infileコマンドを使用しています...

4

6 に答える 6

10

コンテンツは次のようになります。

"139", "pg89898", "op89890", "1,000,000.00"

次に、コマンドに次を追加できます。

ENCLOSED BY '"' ESCAPED BY "\\"

問題はありません。

また、段落や文字列が含まれていない場合に試すことができる,もの:

FIELDS TERMINATED BY ', '
于 2012-08-01T12:30:25.470 に答える
1

入力されている CSV ファイルを変更するか、CSV ファイルを生成する出力を変更する必要があります - 同じように聞こえますが、そうではありません。

フィールドを引用符でカプセル化することで受信データを変更し、次のようなコマンドを使用してフィールドがカプセル化されていることを認識できるようにコマンドを更新できます。ENCLOSED BY '"'

また

数値を 1,000,000 ではなく 1000000 としてフォーマットするように出力を変更します。

于 2012-08-01T12:30:31.647 に答える
0

回避策として、これを試してください-

LOAD DATA INFILE
...
FIELDS TERMINATED BY ', '
...
于 2012-08-01T12:38:36.613 に答える
0

CSV では、カンマで「列」を区切ります。最後の値は 1,000,000.00 であるため、(意図したとおり) 1 つだけではなく、3 つの異なる列と見なされます。

各値 (列) を引用するか、カンマ (,) を削除して数値形式を変更できます。

于 2012-08-01T12:30:57.663 に答える
0

ファイル全体があなたが書いたとおりである場合、個々の値にその文字列がない場合に限り、(カンマ + スペース) を使用できますfields terminated by ', '。Linux (またはその他の Unix のようなシステム) を使用していて、フィールド区切り記号がコンマ + スペースである場合、sedこの区切り記号を別のものに置き換えるために使用できます。

sed 's/, /|/g' myfile.csv > myfile.txt

ただし、すでに述べたことをお勧めします。各値を引用符または二重引用符で囲んで入力ファイルを変更し、fields terminated by ',' optionally enclosed by '"'.

フィールド終了文字は一意である必要があり、個々の値に含まれていてはならないことに注意してください。

于 2012-08-01T12:38:16.503 に答える