web-dev-qa-db-ja.com

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

私は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で表される)、yes/no(BITで表される)、価格(DECIMALで表される)、およびテキストのぼかし(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つのdatabazse行に対応するようにファイルを解析しています。私は問題なくOpenOfficeにファイルをロードすることができます。

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

更新:

よくわからないときは、マニュアルを読んでください: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

LOAD DATAステートメントにOpenOfficeが推論するのに十分賢いという情報を追加しました、そして今それは正しい数のレコードをロードします:

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レコードがたくさんあり、ロードされたデータのどれも正しい場所にはないようです。

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

多くのグラフィカルなmySQLクライアントは、このようなことのためにとてもいいインポートダイアログを持っています。

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

Import textfile

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

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

enter image description here

119
Pekka 웃

テーブルをデータベースにロードするには、 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'を使用します。

174
michalzuber

私が200以上の行をインポートした最も簡単な方法はphpmyadmin SQLウィンドウのコマンドの下にあります

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

これは.csvデータです。CSV FILE

これがコマンドです。

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

2つ目の列には表示されないようにしてください。そうしないとインポートが停止します

74
DareDevil

問題は古いことを知っています 、しかし私はshare thisをしたいのですが

このメソッドを使用して、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);
56
Fahad

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

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

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

  3. PhpMyAdminインターフェースに進みます。

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

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

  6. CSVファイルを参照してください。

  7. [LOAD DATAを使用してCSV]オプションを選択します。

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

  9. データベース表の場合と同じ順序で列名を入力してください。

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

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

24
Farhan

あなたはあなたのLOAD DATAステートメントで列をリストすることによってこれを直すことができます。 マニュアルから

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

...だからあなたの場合あなたはそれらがcsvファイルに現れる順番で99のカラムをリストする必要があります。

11
lafncow

Mysqlのコマンドラインはインポート時に問題が多すぎます。これがあなたのやり方です。

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

これを試して、それは私のために働いた

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

ここでIGNORE 1 ROWSはフィールド名を含む最初の行を無視します。ファイル名にはファイルの絶対パスを入力する必要があります。

6
David

私はなにか奇妙なことを見ます。あなたはESCAPINGにあなたがENCLOSINGに使ったのと同じ文字を使っています。だからエンジンは '"'を見つけたときに何をすべきかわからないし、それが正しい場所に何もないように見える理由だと私は思います。

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
Juan

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

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

enter image description here

3
Vitaliy Pak

CSVに基づいてSQLのcreate/insertステートメントを生成するためのこのオンラインツールを試すこともできます。 http://www.convertcsvtomysql.com/ /

このツールについて私が好きなもの:

  • 単純な
  • INSERT文だけでなく、テーブルを生成するためのCREATE文も生成します。
  • CREATEステートメントを生成するとき、このツールはすべてのフィールドをVARCHARにするだけでなく、CSV内のデータを分析し、その分析に基づいて適切なデータ型を選択します。

デメリット

  • 入力ファイルサイズは3MBに制限されています
  • あなたは自分のデータを第三者に譲渡したくないかもしれません。
2
Ievgen

さらに別の解決策は、すばらしい csvkit suiteの csvsql toolを使用することです。

使用例

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
2
ruvim

サーバー名、ユーザー名、パスワード、データベース名、ファイルのパス、テーブル名、データベースに挿入するフィールドを変更します。

<?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>'
       }
    ?>
1
Srikrushna Pal

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

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

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

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

1
zipzit

PHP mysqlデータベースへのインポートcsvファイルのクエリ

$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,[email protected]
Brandon Wilson,541-309-5149,[email protected]
Craig White,516-795-8065,[email protected]
David Whitney,713-214-3966,[email protected]

これがExcelファイルのスクリーンショットのサンプルです。

enter image description here

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

また、メモ帳++などのメモ帳を使用して開いた場合は、次のように.csvデータのスクリーンショットが表示されます。

enter image description here

Mysql Tableのように、ヘッダーを削除し、.csvの列の位置合わせを行ってください。 folder_nameをあなたのフォルダ名に置き換えてください。

LOAD DATA LOCAL INFILE
'D:/folder_name/myfilename.csv'で終了するテーブルメールフィールド '、'(fname、lname、email、phone);

ビッグデータの場合は、コーヒーを飲んでそれをロードすることができます。

それだけであなたは必要なのです。

1
Magige Daniel

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

サンプルファイル:Overseas_trade_index data 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;
    
0
sivamani
0
Georgy Gobozov

私は同じ仕事をするのにmysqlワークベンチを使います。

  1. 新しいスキーマを作成する
  2. 新しく作成されたスキーマを開く
  3. 「Tables」を右クリックして「Table Data Import Wizard」を選択します。
  4. csvファイルのパスとテーブル名を指定し、最後に列の種類を設定します。ウィザードがデフォルトの列の種類をその値に基づいて設定するからです。

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

0
Mehdi