49

いくつかの一般的なフィールドを持つタイムシートのデータベース テーブルがあります。

id, client_id, project_id, task_id, description, time, date 

他にもありますが、要点は以上です。

ユーザーにデータのバックアップを提供するために、そのテーブルで CSV ファイルへのエクスポートを一晩実行しています。また、一部のカスタム レポートを含むマクロ Excel ファイルのデータ インポートとしても使用されます。

これはすべて、php を使用してタイムシートをループし、行をファイルに出力することで機能します。

問題は、実行に数時間かかる可能性がある大規模なデータベースでは許容できないことです。そこで、MySQL コマンドで書き直したところ、INTO OUTFILE実行にかかる時間が数秒に短縮されました。これは素晴らしいことでした。

現在の問題は、説明フィールドのすべての改行文字などをエスケープできないように見えることです。実際、ユーザーは改行/改行を含む任意の文字の組み合わせをここに入力できます。

これは、私が持っている MySQL コードのスニペットです。

SELECT id, 
       client,
       project,
       task,
       REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, 
       time,
       date  
      INTO OUTFILE '/path/to/file.csv'
      FIELDS ESCAPED BY '""'
      TERMINATED BY ',' ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      FROM ....

しかし...

出力ファイルのソースを見てみると、改行がまだファイルに存在するため、Excel の CSV インポートは、Excel ウィザードが作成したすべての派手なマクロとピボット テーブルを壊します。

最善の行動方針について何か考えはありますか?

4

6 に答える 6

82

あなたの声明は次のようになるはずです:

SELECT id, 
   client,
   project,
   task,
   description, 
   time,
   date  
  INTO OUTFILE '/path/to/file.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM ts

主にFIELDS ESCAPED BY '""'オプションなしで、OPTIONALLY ENCLOSED BY '"'説明フィールドなどのトリックを行い、数値はExcelで数値として扱われます(数値で構成される文字列ではありません)

また、電話してみてください:

SET NAMES utf8;

出力ファイルを選択する前に、文字エンコーディングをインラインで取得するのに役立つ場合があります(すべてUTF8)

乗り方を教えてください。

于 2009-07-28T22:06:40.013 に答える
18

ここで機能したのは次のとおりです: Excel 2003 をシミュレートします (CSV 形式で保存)

SELECT 
REPLACE( IFNULL(notes, ''), '\r\n' , '\n' )   AS notes
FROM sometables
INTO OUTFILE '/tmp/test.csv' 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
  1. Excel は行区切り記号として \r\n を保存します。
  2. Excel は、列データ内の改行文字の \n を保存します
  3. 最初にデータ内の \r\n を置き換える必要があります。そうしないと、Excel は次の行の開始と見なします。
于 2010-05-18T16:12:50.067 に答える
2

以下を試してみるとどうなりますか?

REPLACE二重ステートメントの代わりに、次を試してください。

REPLACE(IFNULL(ts.description, ''),'\r\n', '\n')

LINES TERMINATED BY '\r\n'また、ただの代わりにすべきだと思います'\n'

于 2009-07-14T06:22:59.053 に答える
2

確認のために出力ファイルを実際に見なくても、値を削除する必要があると思いFIELDS ESCAPED BYます。

MySQLFIELDS ESCAPED BYはおそらく、あなたが期待していなかった 2 つの方法で動作しています。(2)およびの値を含め、MySQL がエスケープする必要があると判断した文字の前に使用されます。これはほとんどのコンピューティングの世界にとって理にかなっていますが、Excel がエスケープする方法ではありません。FIELDS TERMINATED BYLINES TERMINATED BY

REPLACEdoubleが機能していて、リテラルの改行をスペース (Windows スタイルの改行の場合は 2 つのスペース) に正常に置き換えていると思います。しかし、データにコンマ (フィールド セパレータではなくリテラル) がある場合、これらの前に引用符が付きます。これは、Excel が MySQL とは大きく異なる方法で処理します。その場合、Excel をつまずかせている誤った改行は、実際には MySQL が行末記号として意図した改行です。

于 2009-07-15T03:25:27.410 に答える
0

おそらく役に立たないでしょうが、そのコンテンツでCSVテーブルを作成してみることができます。

DROP TABLE IF EXISTS foo_export;
CREATE TABLE foo_export LIKE foo;
ALTER TABLE foo_export ENGINE=CSV;
INSERT INTO foo_export SELECT id, 
   client,
   project,
   task,
   REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, 
   time,
   date
  FROM ....
于 2009-07-29T14:45:47.080 に答える