web-dev-qa-db-ja.com

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

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

これを見つけました:

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

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

93
lcm

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)

続きを読む: CSVファイルをMySQLに直接インポートする

編集

あなたの場合、最初の行を見つけ、それらを列名として割り当てるために、最初にインタプリタを書く必要があります。


EDIT-2

MySQLドキュメントから LOAD DATA構文上

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)
146
hjpotter92

必要なことを行う簡単な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
23
Hawkee

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

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

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

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

4
Jose Ortiz

テキストファイルまたはcsvファイルからデータをロードするには、次のコマンドを使用します

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

上記のコマンドでは、私の場合、ロードされる列は1つだけであるため、「terminated by」と「enclosed by」はないため、空のままにしておきます。プログラマーは区切り文字を入力できます。例えば、(コンマ)または "または;または任意のもの。

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

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

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

Sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  
3
Rakesh

「mysql -u -p --local-infile」としてmysqlを起動すると、正常に動作します

3
marciomolusco

これを行うためのコードをいくつか作成しました。いくつかのスニペットを追加します。

$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());
2
ravenchilde

私はしばらくの間これと格闘しました。問題は、データのロード方法ではなく、データを保持するテーブルの作成方法にあります。データをインポートする前に、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に移行するときです。

2
agentv

Pythonで csvMySQL Connector を使用して行った方法は次のとおりです。

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に準備されたステートメントを使用する
  • 'rb'バイナリでfile.csvを開きます
  • skipinitialspaceオプションなど、一部のCSVファイルには tweaking が必要な場合があります。
  • 255の幅が十分でない場合、INSERTでエラーが発生し、最初からやり直す必要があります。
  • 列タイプを調整します。 ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • 主キー を追加します。 ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;
1
Bob Stein

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

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
Elangovan

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

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

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

0
jim sims