0

そのため、コマンドを使用して .csv ファイルを mysql に直接インポートしようとしてload data local infileいますが、Excel 数式フィールドの残りのフィールドに遭遇しており、それらを取り除く方法がわかりません。以下の例の最初のフィールドのコンテンツには、その=前に があります。

テーブル構造は最初のフィールドを にできるように設定されていますが、可能であればVARCHAR(100)にしたいと思います。INTアップロードされている csv コンテンツのサンプルを次に示します。

"MID","DBA Name","Partner ID","Partner Name","Sub Partner ID","Sub Partner Name","Active Months","Bonus Amount","Bonus Applied Date","Partner Percentage","Partner Share","Total Payment"
="0008788014065741","company2","7968","me,"11839","Joe Blow","0","$50.00","","","","$350.64"
="0008788014065756","company2","7968","you","11839","Joe Blow","0","$50.00","","","","$294.60"

データのインポートに使用している mysql load コマンドは次のとおりです。

sql = """
    LOAD DATA LOCAL INFILE '%(upload)s' IGNORE INTO TABLE `%(table)s`
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
    LINES TERMINATED BY '\\r\\n' 
    IGNORE 1 LINES ;
      """ % {"upload": file, "table": report}
self.db.query( sql )

正規表現などに関して、インポートでできることはありますか? わかりません、ここでストローをつかんでいるだけです...

入力していただきありがとうございます!

4

1 に答える 1

2

で 2 つの方法で実行できますLOAD DATA INFILE

最初に最初のフィールド値をそのまま読み取り、それから等号=と二重引用符を inSET句から取り除きます。また、次のようなデータをロードしているときに、他の変換を実行する可能性が最も高くなります。

  • NULLフィールドが空のときに実際の s を設定します
  • 金額からドル記号を取り除く
  • おそらく日付値を変換する必要があります(ただし、サンプルデータにはそれらがないため、推測する情報はありません)
LOAD DATA LOCAL INFILE '/path/to/your/file.csv' 
IGNORE INTO TABLE table_name
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES 
(@MID, DBAName, PartnerID, PartnerName, SubPartnerID, SubPartnerName, ActiveMonths,
 @BonusAmount, @BonusAppliedDate, @PartnerPercentage, @PartnerShare, @TotalPayment)
SET MID = TRIM(BOTH '"' FROM SUBSTR(@MID, 2)), -- here we get rid of equal sign and double quotes
    BonusAmount  = TRIM(LEADING '$' FROM NULLIF(@BonusAmount, '')),
    BonusAppliedDate = NULLIF(@BonusAppliedDate, ''),
    PartnerPercentage = NULLIF(@PartnerPercentage, ''),
    PartnerShare = TRIM(LEADING '$' FROM NULLIF(@PartnerShare, '')),
    TotalPayment = TRIM(LEADING '$' FROM NULLIF(@TotalPayment, ''))

2番目のアプローチはLINES STARTING BY条項を活用することです

LOAD DATA LOCAL INFILE '/path/to/your/file.csv' 
IGNORE INTO TABLE table_name
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n' STARTING BY '='
    IGNORE 1 LINES 
(MID, DBAName, PartnerID, PartnerName, SubPartnerID, SubPartnerName, ActiveMonths, @BonusAmount, BonusAppliedDate, PartnerPercentage, PartnerShare, @TotalPayment)
SET BonusAmount  = TRIM(LEADING '$' FROM NULLIF(@BonusAmount, '')),
    BonusAppliedDate = NULLIF(@BonusAppliedDate, ''),
    PartnerPercentage = NULLIF(@PartnerPercentage, ''),
    PartnerShare = TRIM(LEADING '$' FROM NULLIF(@PartnerShare, '')),
    TotalPayment = TRIM(LEADING '$' FROM NULLIF(@TotalPayment, ''))

ターゲットテーブルスキーマが次のようになっている場合

CREATE TABLE table_name 
(
    MID BIGINT, 
    DBAName           VARCHAR(100),
    PartnerID         INT,
    PartnerName       VARCHAR(100),
    SubPartnerID      INT,
    SubPartnerName    VARCHAR(100),
    ActiveMonths      INT,
    BonusAmount       DECIMAL(19, 2),
    BonusAppliedDate  DATE,
    PartnerPercentage DECIMAL(3, 2),
    PartnerShare      DECIMAL(19, 2),
    TotalPayment      DECIMAL(19, 2)
);

次に、いずれかの方法でロードした後、表に表示されるのは次のとおりです

mysql> select * from table_name;
+------+----------+-----------+---------- ---+--------------+----------------+-------------- +-------------+------------------+---------------- ---+--------------+--------------+
| | ミッド | DBA名 | パートナー ID | パートナー名 | サブパートナー ID | サブパートナー名 | アクティブな月 | ボーナス額 | ボーナス適用日 | パートナーの割合 | パートナーシェア | 支払い総額 |
+------+----------+-----------+---------- ---+--------------+----------------+-------------- +-------------+------------------+---------------- ---+--------------+--------------+
| | 8788014065741 | 会社2 | 7968 | 私 | 私 | 11839 | ジョーブロー | 0 | 50.00 | ヌル | ヌル | ヌル | 350.64 |
| | 8788014065756 | 会社2 | 7968 | あなた | 11839 | ジョーブロー | 0 | 50.00 | ヌル | ヌル | ヌル | 294.60 |
+------+----------+-----------+---------- ---+--------------+----------------+-------------- +-------------+------------------+---------------- ---+--------------+--------------+
2 行セット (0.00 秒)
于 2013-09-27T18:56:27.540 に答える