MySQLファイルにCSVファイルをインポートするにはどうすればよいですか?


306

正常な形式にリファクタリングできるように、MySQLテーブルにロードしようとしているクライアントからの非正規化イベント日誌CSVがあります。CSVファイルの列ごとに1つのフィールドを持つ「CSVImport」というテーブルを作成しました。CSVには99列が含まれているため、これ自体は十分に困難な作業でした。

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

テーブルに制約はなく、カウント(INTで表される)、はい/いいえ(BITで表される)、価格(DECIMALで表される)、およびテキストのぼかし( TEXTで表されます)。

ファイルにデータをロードしようとしました:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

テーブル全体がで埋められていNULLます。

問題は、テキストのテキストに複数の行が含まれており、MySQLが新しい行を1つのデータベース行に対応するようにファイルを解析していることだと思います。OpenOfficeに問題なくファイルをロードできます。

clientdata.csvファイルには、2593行と570レコードが含まれています。最初の行には列名が含まれています。私はそれがコンマで区切られていると思います、そしてテキストはどうやら二重引用符で区切られています。

更新:

疑問がある場合は、マニュアルを読んでください:http : //dev.mysql.com/doc/refman/5.0/en/load-data.html

LOAD DATAOpenOfficeは十分に推論できるほどスマートであり、正しい数のレコードが読み込まれるというステートメントに情報を追加しました。

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

しかし、それでも完全に多くのNULLレコードがあり、ロードされたデータはどれも正しい場所にないようです。


17
OSXを使用している場合、Sequel Proには素晴らしいインポートツールがあり、無料です ;-)
Merrick

41
元のポスターが他の誰よりも自分の質問にうまく答えたのは私にとって驚くべきことです。UIではなくプログラムである可能性のある既存のSQLコマンドがあるときに、なぜ多くの人がソフトウェアの推奨を行う準備ができているのかわかりません。ベース。他の人については知りませんが、プログラムでは、タイムスタンプに基づいてファイルを自動インポートするようにスクリプトを設定できますが、UIベースは純粋に手動です。
Chris Cirefice 14

@ChrisCirefice:受け入れられた答えはそれをよく説明していると思います。彼は、グラフィカルプログラムが役立つ「データのロード」コマンドを手動で作成するための助けを必要としていました。グラフィカルプログラムが「データの読み込み」コマンドを作成すると、プログラムで再利用できます。
AlexC 2014

@Merrickこれはosxで
ごちそうになった

私は、Excelの構文ジェネレーターツールと一緒にcsvデータをmysqlロードするための広範なチュートリアルを書きました。
mysql_user 2018年

回答:


133

問題の中心は、CSVファイルの列を表の列と一致させることです。

多くのグラフィカルなmySQLクライアントには、この種のもののための非常に優れたインポートダイアログがあります。

私の仕事のお気に入りはWindowsベースのHeidiSQLです。LOAD DATAコマンドを作成するためのグラフィカルインターフェイスを提供します。後でプログラムで再利用できます。

テキストファイルをインポート

スクリーンショット:[テキストファイルのインポート]ダイアログ

[テキストファイルのインポート]ダイアログを開くには、次の場所に移動しTools > Import CSV fileます。

ここに画像の説明を入力してください


25
Mac OSXの場合は、Sequel Proを使用します。
Agi Hammerthief 2014年

3
試してみましたが、列名を使用する代わりに、まずテーブルを作成する必要があります。
ドミニク

3
続行する前にテーブルを選択する必要があります...そしてポイント全体がテーブルを作成する必要がないため...
Dominique

3
Linuxでは、HeidiSQLはWineで非常にうまく機能することに注意してください。
AlejandroVD

1
@Paul非常にポイント答えのは、GUIツールは簡単にテーブルの列にインポート列を一致させることができるということです。
Pekka '25

191

mysqlimportを使用してテーブルをデータベースにロードします。

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

私はそれをhttp://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/で見つけました

区切り文字をタブにするには、次を使用します --fields-terminated-by='\t'


6
mysqlimportLOAD DATA INFILE...裏で使用しているので、ほとんど同じです。
MladenJablanović14年

8
と同様にLOAD DATA INFILE、使用する前にテーブルを作成する必要がありますmysqlimport
Marcus Downing

@MladenJablanović、それは間違いなく同じことではありません。10億行をインポートしてみてください。パフォーマンスの点で大きな違いがあることに驚かれることでしょう
忍者

@ninjabberドキュメントによると mysqlimport クライアントはLOAD DATA INFILEへのコマンドラインインターフェースを提供するため、を超えるパフォーマンス上の利点を提供することは理論的に不可能LOAD DATA INFILEです。
MladenJablanović16年

1
また、必要--fields-optionally-enclosed-by=\"--fieldsがエスケープ-で、 `= \`と
chaintng

80

200行以上をインポートした最も簡単な方法は、phpmyadmin sqlウィンドウのコマンドの下です

2つの列CountryId、CountryNameを持つ簡単な国のテーブルがあります。

ここに.csvデータがありますCSVファイル

ここにコマンドがあります:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

2番目の列に表示されないことを1つ覚えておいてください。そうしないと、インポートが停止します


1
'、'-> '\ t'、 '"'-> '' TSVファイルの場合、ヘッダーがない場合は最後の行を削除します(検索クローラーがこれにインデックスを付けることを希望します)
Bleeding Fingers

16
ローカルファイルの場合、必要になる場合がありますLOAD DATA LOCAL INFILE。これがエラー1148「使用されたコマンドは許可されていません」をスローした場合、コマンドラインでを実行してmysqlを有効にすることができます--local-infile
Big McLargeHuge 2015

エラーが発生しました:エラー1045(28000):ユーザー 'user' @ '%'のアクセスが拒否されました(パスワードを使用:YES)
ARUNBALAN NV

ユーザーにすべてのアクセスを許可する必要があります。管理パネルから、スクリプトをインポートしてみてください。
DareDevil 2017年

1
このエラーが発生します:MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません
Agniswar Bakshi

66

質問が古いことは知っていますが、これを共有したいと思います

このメソッドを使用して、0.046秒で 100Kを超えるレコード(約5MB)をインポートしました

方法は次のとおりです。

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

最後の行を含めることは非常に重要です。複数のフィールドがある場合、つまり通常は最後のフィールドをスキップします(MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

次に、フィールドのタイトルとして最初の行があると仮定すると、この行も含めることができます

IGNORE 1 ROWS

これは、ファイルにヘッダー行がある場合のようです。

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);

16k行と48列をインポートしました。バディ、ありがとう。
Renjith VR 2017

これが最良の解決策です。これがどれほど速いか知りたい人のために:オンボードMySQLサーバー(高性能RDSではない)を使用して、月額$ 20のAWS Lightsailインスタンスに14秒未満で320万行をインポートしました。驚くばかり!
master_gracey

この行で(field_1,field_2 , field_3);は、.csvファイルまたはテーブルの列のリストを参照していますか?つまり、これらのフィールドは何ですか?
tera_789

@ tera_789 csvファイル内の、テーブルにおそらく一致するもの
Fahad

データ形式に従う必要があります。例(私の場合)<pre> first_name、last_name、dob、phone_number、email、name、lastName、12-05-2018,54545、faiz @ gmail.com、name1、lastName1,2018-05-12,456、faiz1 @ gmail .com、name2、lastName2、2018-05-12、456、faiz2 @ gmail.com、name3、lastName3、2018-05-22、456、faiz3 @ gmail.com、name4、lastName4、1988-05-22、456、faiz4 @ gmail.com 、name5、lastName5、1988-05-22、456、faiz5 @ gmail.com、name6、lastName6、1987-05-21、456、faiz6 @ gmail.com </ pre>
Faiz Ahmed

32

phpMyAdminはCSVインポートを処理できます。手順は次のとおりです。

  1. MySQLテーブルのフィールドと同じ順序でフィールドを持つようにCSVファイルを準備します。

  2. CSVからヘッダー行を削除し(存在する場合)、データのみがファイルに含まれるようにします。

  3. phpMyAdminインターフェースに移動します。

  4. 左側のメニューでテーブルを選択します。

  5. 上部のインポートボタンをクリックします。

  6. CSVファイルを参照します。

  7. オプション「LOAD DATAを使用したCSV」を選択します。

  8. 「終了フィールド」に「、」を入力します。

  9. 列名は、データベーステーブルと同じ順序で入力します。

  10. 移動ボタンをクリックすれば完了です。

これは私が将来の使用のために準備したメモであり、他の誰かが利益を得ることができるならここで共有します。


これは簡単です。SQLを使用してテーブルと列を作成し(ステップ9をスキップ)、CSVをインポートしてデータを挿入することを好みます。NULL自動インクリメントフィールド/列のCSV を設定することを忘れないでください。
シルバー

utf-8を使用するように指示しても、CSVファイルにキリル文字が含まれている場合、phpMyAdminは無残に失敗します。
Fran Marzoa

大きなCSVファイルをインポートする場合は、インポートサイズを変更することを忘れないでください。ちなみに、大きなCSVファイルには適していません。
Avi

ローカルのcsvファイルを参照できないため、最初に.csvファイルをWebクライアントにダウンロードする必要があります。
mckenzm

はい、できます。「ローカルキーワード」のチェックボックスを
オンに

12

これを修正するには、LOAD DATAステートメントで列をリストします。マニュアルから:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

...そのため、あなたのケースでは、CSVファイルに表示される順序で99列をリストする必要があります。


8

これを試してください、それは私のために働きました

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

ここでIGNORE 1 ROWSは、フィールド名を含む最初の行を無視します。ファイル名には、ファイルの絶対パスを入力する必要があることに注意してください。


これが最良の答えです。単一のSQLコマンドで実行できるのに、なぜ別のツールを使用するのですか?
sdgfsdh 2018年

サーバーで実行しているmysqlにファイルをロードしようとするときに、これを機能させる方法を知っていますか?ファイル(パスワード)のアクセスが拒否されました。csvファイルの場所のパスワードをどこに入力しますか?
バクタワー

7

mysqlコマンドラインは、インポート時に問題が多すぎる傾向があります。方法は次のとおりです。

  • スペースを含まないようにヘッダー名を編集するには、Excelを使用してください
  • .csvとして保存
  • 無料のNavicat Lite Sql Browserを使用して、新しいテーブルをインポートして自動作成します(名前を付けます)
  • 新しいテーブルを開き、IDのプライマリ自動番号列を挿入します
  • 必要に応じて列のタイプを変更します。
  • できた!

5

MySQL Workbench(現在6.3バージョン)を使用している場合は、次の方法でこれを実行できます。

  1. 「テーブル」を右クリックします。
  2. テーブルデータインポートウィザードを選択しました。
  3. csvファイルを選択して、指示に従います(JSONも使用できます)。良いことは、インポートするCSVファイルに基づいて新しいテーブルを作成するか、既存のテーブルにデータをロードできることです

ここに画像の説明を入力してください


+1。mysqlはのために私にエラーを与え続けているので、私はこれを使用LOAD DATA INFILEしてmysqlimport(「これはMySQLのこのバージョンではサポートされていません」)
clmno

この方法は機能しますが、少し遅いです。この機能を使用すると大規模なINSERTクエリが作成され、一度にすべて実行しようとすると思いましたが、この方法で実行すると、実際にINSERTは行ごとに1 回実行されるように見えます。
DaveTheMinion 2018

4

奇妙なものが見えます。ESCAPINGには、ENCLOSINGと同じ文字を使用しています。したがって、エンジンは「」が見つかったときに何をすべきかわからないので、適切な場所に何もないように思われるのはそのためだと思います。ESCAPINGの行を削除すると、問題なく動作するはずです。

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

CSVを(手動で、視覚的に、...)分析して、エスケープに使用する文字を見つけない限り。時々「\」です。ただし、持っていない場合は使用しないでください。


3

さらに別の解決策は、すばらしいcsvkitスイートからcsvsqlツールを使用することです。

使用例:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

このツールは、データ型(デフォルトの動作)を自動的に推測し、テーブルを作成して、作成したテーブルにデータを挿入できます。--overwriteオプションがすでに存在する場合、テーブルを削除するために使用できます。--insertオプション—ファイルからテーブルを生成します。

スイートをインストールするには

pip install csvkit

前提条件: python-devlibmysqlclient-devMySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

3

CSVファイルをSQLテーブルにインポートする方法

サンプルファイル:Overseas_trade_indexデータCSVファイル

手順:

  1. のテーブルを作成する必要がありますoverseas_trade_index

  2. csvファイルに関連する列を作成する必要があります。

    SQLクエリ:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. mysqlデータベースをターミナルに接続する必要があります。

    =>show databases;
    =>use database;
    =>show tables;
  4. このコマンドを入力してcsvデータをmysqlテーブルにインポートしてください。

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. sqldatabaseでこの海外貿易インデックスデータを見つけます。

    select * from trade_index;

2

ExcelスプレッドシートがロードされたWindowsマシンを使用している場合、Excelへの新しいmySqlプラグインは驚異的です。オラクルの人々は本当にそのソフトウェアで素晴らしい仕事をしました。Excelから直接データベース接続を行うことができます。そのプラグインはデータを分析し、データと一致する形式でテーブルを設定します。変換するデータのモンスターの大きなcsvファイルがいくつかありました。このツールは大幅な時間の節約になりました。

http://dev.mysql.com/downloads/windows/excel/

Excel内から更新を行って、データベースにオンラインで取り込むことができます。これは、超安価なGoDaddy共有ホスティングで作成されたmySqlファイルで非常にうまく機能しました。(GoDaddyでテーブルを作成するときは、データベースのオフサイトアクセスを有効にするために、いくつかの標準外の設定を選択する必要があります...)

このプラグインを使用すると、XLスプレッドシートとオンラインのmySqlデータストレージとの間に純粋な双方向性があります。


2

私はmysqlワークベンチを使用して同じ仕事をします。

  1. 新しいスキーマを作成する
  2. 新しく作成されたスキーマを開く
  3. 「テーブル」を右クリックし、「テーブルデータインポートウィザード」を選択します。
  4. ウィザードはデフォルトの列タイプを値に基づいて設定するため、csvファイルのパスとテーブル名を指定し、最後に列タイプを構成します。

注:「tail -f [mysqlworkbenchpath] /log/wb*.log」を使用して、mysqlワークベンチのログファイルでエラーを確認してください。


回答ありがとうございます。MySQLの初心者なので、知りませんでした。CSVで役に立ちました。次に、Accessから10個のテーブルをインポートする必要もあります。これらのテーブルをExcelにエクスポートし、ExcelからCSVにエクスポートしてから、これらの手順を使用するのが最も簡単な方法だと思いますか。
ナオミ

この方法ではすべての行がインポートされないことがわかりました:(5,342行のうち、2,485行しかインポートされませんでした。なぜですか?
Naomi

Naomiさん、mysqlworkbenchログを確認すると、データのインポートが停止した理由が表示されます。DBおよびCSVファイルにいくつかのnull値または不一致タイプがある可能性があります。しかし、私はフアンの答えに従うことを強くお勧めします(私の直後)。彼の解決策は私よりも優れており、すっきりしています。
Mehdi

1

以下は、Excelファイルのスクリーンショットの例です。

ここに画像の説明を入力してください

名前を付けて保存し、.csvを選択します。

また、notepad ++またはその他のメモ帳を使用して開いた場合、.csvデータのスクリーンショットは次のようになります。

ここに画像の説明を入力してください

mysqlテーブルのように、ヘッダーを削除し、.csvに列の配置があることを確認してください。folder_nameをフォルダー名に置き換えます

データローカルロードをロード
'D:/folder_name/myfilename.csv' INTO TABLE mail FIELDSTED TERMINATED BY '、'(fname、lname、email、phone);

ビッグデータなら、コーヒーを飲んでロードできます!。

それで十分です。



0

mysqlデータベースにcsvファイルをインポートするためのPHPクエリ

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

**サンプルCSVファイルデータ**

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus

0

servername、username、password、dbname、ファイルのパス、tablename、および挿入するデータベース内のフィールドを変更します

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.