Csvファイルをmysqlテーブルにアップロードする最良/最速の方法は何ですか?データの最初の行を列名として使用したいと思います。
これを見つけました:
しかし、唯一の答えは、シェルではなくGUIを使用することでしたか?
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に直接インポートする
あなたの場合、最初の行を見つけ、それらを列名として割り当てるために、最初にインタプリタを書く必要があります。
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)
必要なことを行う簡単な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
最初に、csvファイルにある列と同じ数のテーブルをデータベースに作成します。
次に、次のクエリを使用します
LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
phpadminをインストールできる場合は、csvファイルをデータベースにインポートできるインポートセクションがあり、ファイルの最初の行にヘッダーを設定するためのチェックボックスもあります(これがオフの場合、最初の行はデータの一部になります
テキストファイルまたは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
「mysql -u -p --local-infile」としてmysqlを起動すると、正常に動作します
これを行うためのコードをいくつか作成しました。いくつかのスニペットを追加します。
$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());
私はしばらくの間これと格闘しました。問題は、データのロード方法ではなく、データを保持するテーブルの作成方法にあります。データをインポートする前に、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に移行するときです。
Pythonで csv と MySQL 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()
キーポイント
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
他の人が述べたように、ロードデータローカルインファイルはうまく機能します。 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を使用すると簡単です.....