mysqlテーブルにCSVをインポートする


96

mysqlテーブルにcsvファイルをアップロードするための最良/最速の方法は何ですか?データの最初の行を列名として使用したいと思います。

これが見つかりました:

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

しかし、唯一の答えは、GUIではなくシェルを使用することでしたか?


3
また、GUIソリューションでもcsvから列名を取得しません...インポートする前にテーブル全体を作成する必要があります
Dominique

質問にはすでに回答があります。stackoverflow.com
David

リンク先の質問で受け入れられた回答は、GUIを使用していた。あなたが参照している回答は昨日提供されましたが、この質問(回答)は2012
。– lcm

回答:


147

CSVファイルから情報を取得するスクリプトを作成する代わりに、MYSQLを直接それにリンクし、次のSQL構文を使用して情報をアップロードできます。

ExcelファイルをMySQLにインポートするには、まずCSVファイルとしてエクスポートします。生成されたCSVファイルからCSVヘッダーを削除し、ExcelがCSVファイルの最後に入力した空のデータを削除します。

その後、次のコマンドを実行して、MySQLテーブルにインポートできます。

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

読んで:MySQLに直接CSVファイルをインポートする

編集

あなたのケースでは、最初の行を見つけて列名として割り当てるために、最初にインタープリターを書く必要があります。


編集-2

構文に関するLOAD DATA MySQLドキュメントから:

このIGNORE number LINESオプションを使用すると、ファイルの先頭の行を無視できます。たとえば、IGNORE 1 LINES列名を含む最初のヘッダー行をスキップするために使用できます。

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

したがって、次のステートメントを使用できます。

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)

8
最初の行を削除する代わりIGNORE 1 LINESに、クエリに追加できます
mb14

ファイルパスをcsvファイルに設定する方法があるかどうか知っていますか?
JasonDavis

失敗したときにこのコマンドをデバッグする方法は?このコマンドでファイルを読み込もうとしていますが、何もしません。

CSVの列を無視したい場合はどうですか?
Marci-man

私のcsvローカルファイルがaws(
rds

24

以下は、必要なことを行う単純なPHPコマンドラインスクリプトです。

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` varchar(250)";
}

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);

?>

最初の行に基づいてテーブルを作成し、残りの行をそこにインポートします。コマンドライン構文は次のとおりです。

php csv_import.php csv_file.csv table_name

2
素晴らしいスクリプト。二重引用符で囲まれたCSVファイルを持っている人(ほとんどの人が読む)に `ENCASED IN '\"' `を追加してくださいfields terminated by ','...部分的に二重引用符で囲まれたCSVでも動作します
Joel Mellon

3
私はあなたの意味だと思うENCLOSED BY '\"'...また、多くの人々が必要とするLINES TERMINATED BY '\r\n'WindowsからのCSVを使用している場合。:そして最後に、バッククォートでフィールド名をエスケープすることは、スペースがある場合には賢明です$columns .= "`$column` varchar(250)";
DLO

1
この答えは、受け入れられた答えよりもはるかに優れています。特に、OPが要求するものを許可します。また、「データの最初の行を列名として使用する」ことも望みます。(私はPythonのスクリプトを好むので、PHPをインストールする必要はありませんが、移植するのは難しくありません。)
LarsH

2
@YumYumYumあなたが抱えている問題についてもっと詳しく教えてもらえますか?
Hawkee 2016

ビールを買えますか?
Joe

4

phpadminをインストールできる場合は、csvファイルをデータベースにインポートできるインポートセクションがあります。ファイルの最初の行にヘッダーを設定するためのチェックボックスもあり、テーブルの列名が含まれています(これがオフの場合、最初の行はデータの一部になります


この機能を使用するには、phpadminなどのアドオンを使用する必要があることに本当に驚いています。回答をありがとう
chrisfs

これはちょうど私の日を作った
マーク

4

最初に、csvファイルにあるのと同じ数の列を持つデータベースにテーブルを作成します。

次に、次のクエリを使用します

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'

CSVの列を無視したい場合はどうですか?
Marci-man

3

テキストファイルまたはcsvファイルからデータをロードするには、コマンドは次のとおりです。

load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);

上記のコマンドでは、私の場合、読み込まれる列が1つしかないため、「終了」と「囲まれ」がないため、空白のままにしておくと、プログラマーが分離文字を入力できます。たとえば。、(コンマ)または "または;または任意のもの。

** mysqlバージョン5以上を使用している人向け**

ファイルをmysqlにロードする前に、以下の2行がサイドに追加されていることを確認する必要があります etc/mysql/my.cnf

my.cnfコマンドを編集するには

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  


2

私はこれを行うためにいくつかのコードを書きました、私はいくつかのスニペットを入れます:

$dir = getcwd(); // Get current working directory where this .php script lives
$fileList = scandir($dir); // scan the directory where this .php lives and make array of file names

次に、CSVヘッダーを取得して、mysqlにインポート方法を指示できるようにします(注:mysql列がcsv列と正確に一致していることを確認してください)。

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

次に、mysqlサーバーにクエリを送信します。

mysqli_query($cons, '
        LOAD DATA LOCAL INFILE "'.$path.'"
            INTO TABLE '.$dbTable.'  
            FIELDS TERMINATED by \',\' ENCLOSED BY \'"\'
            LINES TERMINATED BY \'\n\'
            IGNORE 1 LINES
            ('.$headers.')
            ;
        ')or die(mysql_error());

1

しばらくこれに取り組みました。問題は、データをロードする方法ではなく、それを保持するテーブルを作成する方法にあります。データをインポートする前に、DDLステートメントを生成してテーブルを作成する必要があります。

テーブルに多数の列がある場合は特に困難です。

これが(ほぼ)仕事をするPythonスクリプトです:

#!/usr/bin/python    
import sys
import csv

# get file name (and hence table name) from command line
# exit with usage if no suitable argument   
if len(sys.argv) < 2:
   sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename')
ifile = sys.argv[1]

# emit the standard invocation
print 'create table ' + ifile + ' ('

with open(ifile + '.csv') as inputfile:
   reader = csv.DictReader(inputfile)
   for row in reader:
      k = row.keys()
      for item in k:
         print '`' + item + '` TEXT,'
      break
   print ')\n'

解決しなければならない問題は、最終的なフィールド名とデータ型宣言がカンマで終了することであり、mySQLパーサーはこれを許容しません。

もちろん、すべてのフィールドにTEXTデータ型を使用するという問題もあります。テーブルに数百の列がある場合、VARCHAR(64)はテーブルを大きくしすぎます。

これは、mySQLの最大列数でも壊れるようです。可能な場合は、HiveまたはHBaseに移行するときです。


1

これは、csvMySQLコネクタを使用してPythonで実行した方法です。

import csv
import mysql.connector

credentials = dict(user='...', password='...', database='...', host='...')
connection = mysql.connector.connect(**credentials)
cursor = connection.cursor(prepared=True)
stream = open('filename.csv', 'rb')
csv_file = csv.DictReader(stream, skipinitialspace=True)

query = 'CREATE TABLE t ('
query += ','.join('`{}` VARCHAR(255)'.format(column) for column in csv_file.fieldnames)
query += ')'
cursor.execute(query)
for row in csv_file:
    query = 'INSERT INTO t SET '
    query += ','.join('`{}` = ?'.format(column) for column in row.keys())
    cursor.execute(query, row.values())

stream.close()
cursor.close()
connection.close()

キーポイント

  • INSERTの準備済みステートメントを使用する
  • でfile.csvを開きます 'rb'バイナリで
  • いくつかのCSVファイルが必要になることがあり微調整などを、skipinitialspaceオプション。
  • もし 255ではない十分な広さであるあなたは、INSERTのエラーを取得して最初からやり直す必要があります。
  • 列のタイプを調整します。 ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • たとえば、主キーを追加しますALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

mysqlテーブルにCSVファイルをインポートする

LOAD DATA LOCAL INFILE 'd:\\Site.csv' INTO TABLE `siteurl` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

Character   Escape Sequence
\0      An ASCII NUL (0x00) character
\b      A backspace character
\n      A newline (linefeed) character
\r      A carriage return character
\t      A tab character.
\Z      ASCII 26 (Control+Z)
\N      NULL

訪問:http : //www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html


0

他の人が述べたように、データのローカルローカルファイルの読み込みは問題なく機能します。Hawkeeが投稿したphpスクリプトを試しましたが、うまくいきませんでした。それをデバッグするのではなく、ここで私がやったことです:

1)CSVファイルのヘッダー行をテキストファイルにコピーして貼り付け、emacsで編集します。各フィールドの間にコンマとCRを追加して、それぞれの行に入力します。
2)そのファイルをFieldList.txtとして保存します。3
)各フィールドの定義を含めるようにファイルを編集します(ほとんどはvarcharでしたが、かなりの数はint(x)でした。作成テーブルのテーブル名を(ファイルの先頭に、)をファイルの終わり
。CreateTable.sql として保存4)テーブルを作成するためにCreatetable.sqlファイルからの入力でmysqlクライアントを
起動5)mysqlクライアントを起動し、テーブルを置き換える'LOAD DATA INFILE'コマンドのほとんどをコピーして貼り付け名前とcsvファイル名。FieldList.txtファイルに貼り付けます。フィールドリストに貼り付ける前に、必ず 'IGNORE 1 LINES'を含めてください

多くの作業のように聞こえますが、emacsで簡単に.....


0

TablePlusアプリケーションを使用します。右側のパネルでテーブル名を右クリックし、[インポート...]> [CSVから]を選択します。CSVファイルを選択します。


-3

私は、csvをmysqlにインポートする方法、「データをファイルに読み込む」を含める方法、mysqlワークベンチを使用する方法など、さまざまな方法でグーグル検索しています。

mysqlワークベンチのインポートボタンを使用するときは、まず自分で空のテーブルを作成し、各列のタイプを自分で設定する必要があります。注:nullやauto_incrementではなく、主キーとしてID列を最後に追加する必要があります。そうしないと、後でインポートボタンが表示されなくなります。しかし、CSVファイルの読み込みを開始すると、何も読み込まれず、バグのように見えます。あきらめる。

ラッキー、これまでに見つけた最も簡単な方法は、OracleのmysqlをExcelに使用することです。あなたはここからmysql用にダウンロードできます

これはあなたがやろうとしていることです:Excelでcsvファイルを開き、(データ)タブで、mysqlをExcelボタンで見つけます

すべてのデータを選択し、[mysqlにエクスポート]をクリックします。ID列を主キーとして設定することに注意してください。

終了したら、mysqlワークベンチに移動してテーブルを変更します。たとえば、通貨タイプは、通常の使用では大量のdecimal(10,2)の場合はdecimal(19,4)である必要があります。他のフィールドタイプはvarchar(255)に設定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.