MySQL तालिका में CSV आयात करें




import load-data-infile (10)

एक सीएसवी फ़ाइल को एक mysql तालिका में अपलोड करने का सबसे अच्छा / तेज़ तरीका क्या है? मैं चाहता हूं कि डेटा की पहली पंक्ति कॉलम नाम के रूप में उपयोग की जाए।

यह मिला:

CSS फ़ाइल को MySQL तालिका में कैसे आयात करें

लेकिन एकमात्र जवाब एक जीयूआई का उपयोग करना था और खोल नहीं था?


यहां एक साधारण 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

मैं कुछ समय के लिए इस के साथ कुश्ती। समस्या डेटा को लोड करने के तरीके में नहीं है, लेकिन इसे पकड़ने के लिए तालिका का निर्माण कैसे करें। डेटा आयात करने से पहले टेबल बनाने के लिए आपको एक डीडीएल कथन उत्पन्न करना होगा।

तालिका में बड़ी संख्या में कॉलम होने पर विशेष रूप से मुश्किल होती है।

यहां एक पायथन लिपि है जो (लगभग) नौकरी करता है:

#!/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 पार्सर इसे बर्दाश्त नहीं करेगा।

बेशक यह भी समस्या है कि यह प्रत्येक फ़ील्ड के लिए टेक्स्ट डेटा प्रकार का उपयोग करता है। यदि तालिका में कई सौ कॉलम हैं, तो VARCHAR (64) तालिका को बहुत बड़ा बना देगा।

यह MySQL के लिए अधिकतम कॉलम गिनती को तोड़ने लगता है। यही वह समय है जब आप सक्षम हैं तो हाइव या एचबीएस में जाने का समय है।


पाठ फ़ाइल या सीएसवी फ़ाइल से डेटा लोड करने के लिए आदेश है

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

उपरोक्त आदेश में, मेरे मामले में केवल एक कॉलम लोड किया जाना है, इसलिए "द्वारा समाप्त" और "संलग्न" नहीं है, इसलिए मैंने इसे खाली रखा है अन्यथा प्रोग्रामर अलग-अलग चरित्र में प्रवेश कर सकता है। उदाहरण के लिए। , (अल्पविराम) या "या; या किसी भी चीज।

** उन लोगों के लिए जो mysql संस्करण 5 और ऊपर का उपयोग कर रहे हैं **

फ़ाइल को mysql में लोड करने से पहले यह सुनिश्चित करना चाहिए कि नीचे टॉव लाइन को साइड etc/mysql/my.cnf में जोड़ा गया है etc/mysql/my.cnf

my.cnf कमांड को संपादित करने के लिए है

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  

एक CSV फ़ाइल से जानकारी खींचने के लिए एक स्क्रिप्ट लिखने के बजाय, आप सीधे MYSQL को लिंक कर सकते हैं और निम्न SQL वाक्यविन्यास का उपयोग कर जानकारी अपलोड कर सकते हैं।

एक एक्सेल फ़ाइल को MySQL में आयात करने के लिए, पहले इसे CSV फ़ाइल के रूप में निर्यात करें। सीएसवी हेडर को सीएसवी फ़ाइल के अंत में रिक्त डेटा के साथ जेनरेट की गई CSV फ़ाइल से निकालें।

फिर आप इसे चलाकर एक MySQL तालिका में आयात कर सकते हैं:

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

जैसा कि पढ़ा गया है: सीएसवी फ़ाइल को सीधे MySQL में आयात करें

संपादित करें

आपके मामले के लिए, आपको पहली पंक्ति खोजने के लिए, और कॉलम नाम के रूप में असाइन करने के लिए पहले एक दुभाषिया लिखना होगा।

संपादित -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)

यदि आपके पास phpadmin स्थापित करने की क्षमता है, तो एक आयात अनुभाग है जहां आप अपने डेटाबेस में सीएसवी फाइल आयात कर सकते हैं, फ़ाइल के पहले पंक्ति में हेडर सेट करने के लिए एक चेकबॉक्स भी है, जिसमें टेबल कॉलम नाम होते हैं (यदि यह अनचेक किया गया है, पहली पंक्ति डेटा का हिस्सा बन जाएगी


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


जैसा कि अन्य ने उल्लेख किया है, भार डेटा स्थानीय infile बस ठीक काम करता है। मैंने php स्क्रिप्ट की कोशिश की जो हकी ने पोस्ट किया, लेकिन मेरे लिए काम नहीं किया। इसे डीबग करने के बजाय, मैंने यह किया है:

1) सीएसवी फ़ाइल की हेडर पंक्ति को एक txt फ़ाइल में कॉपी / पेस्ट करें और emacs के साथ संपादित करें। प्रत्येक को अपनी लाइन पर प्राप्त करने के लिए प्रत्येक फ़ील्ड के बीच एक अल्पविराम और सीआर जोड़ें।
2) उस फ़ाइल को FieldList.txt के रूप में सहेजें
3) फ़ाइल को प्रत्येक फ़ील्ड के लिए डिफेंस शामिल करने के लिए संपादित करें (अधिकांश वर्चर थे, लेकिन बहुत से int int (x) थे। फ़ाइल के अंत में तालिका तालिका टैबलेट (फ़ाइल की शुरुआत में) और जोड़ें। इसे CreateTable के रूप में सहेजें .sql
4) तालिका बनाने के लिए Createtable.sql फ़ाइल से इनपुट के साथ mysql क्लाइंट प्रारंभ करें
5) mysql क्लाइंट शुरू करें, 'टेबल डेटा INFILE' कमांड में कॉपी / पेस्ट करें, मेरे टेबल नाम और सीएसवी फ़ाइल नाम को कम करें। FieldList.txt फ़ाइल में पेस्ट करें। फ़ील्ड सूची में पेस्ट करने से पहले 'इग्नोर 1 लाइन' को शामिल करना सुनिश्चित करें

बहुत सारे काम की तरह लगता है, लेकिन emacs के साथ आसान .....


मैंने ऐसा करने के लिए कुछ कोड लिखा, मैं कुछ स्निपेट में डालूंगा:

$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

फिर सीएसवी हेडर प्राप्त करें ताकि आप mysql को आयात करने के बारे में बता सकें (नोट: सुनिश्चित करें कि आपके mysql कॉलम वास्तव में सीएसवी कॉलम से मेल खाते हैं):

//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());

यदि आप mysql को "mysql -u -p --local-infile" के रूप में प्रारंभ करते हैं, तो यह ठीक काम करेगा


csv और MySQL कनेक्टर का उपयोग करके मैंने पाइथन में यह कैसे किया है:

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 खोलें
  • कुछ सीएसवी फ़ाइलों को tweaking आवश्यकता हो सकती है, जैसे skipinitialspace विकल्प।
  • यदि 255 पर्याप्त चौड़ा नहीं है तो आपको INSERT पर त्रुटियां मिलेंगी और इसे शुरू करना होगा।
  • स्तंभ प्रकार समायोजित करें, उदाहरण के लिए ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • एक प्राथमिक कुंजी जोड़ें, उदाहरण के लिए ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT; प्राथमिक प्राथमिक कुंजी ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;




database-table