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


96

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

यह मिला:

CSV फ़ाइल को MySQL टेबल में कैसे आयात करें

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


3
और यहां तक ​​कि जीयूआई समाधान सीएसवी से कॉलम के नाम नहीं लेता है ... आपको आयात करने से पहले पूरी तालिका बनाने की आवश्यकता
डोमिनिक

इस सवाल का पहले से ही एक जवाब है यहां stackoverflow.com/questions/3635166/…
David

जिस प्रश्न पर आप लिंक कर रहे हैं, उस पर स्वीकृत उत्तर GUI का उपयोग कर रहा था। आप जिस संदर्भ का संदर्भ दे रहे हैं वह कल प्रदान किया गया था जबकि यह प्रश्न (उत्तर) 2012 से है।
lcm

जवाबों:


147

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

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 में आयात करें

संपादित करें

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


संपादित -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 फ़ाइल में फ़ाइल पथ सेट करने का कोई तरीका है?
जेसनडेविस

असफल होने पर इस कमांड को कैसे डीबग करें? मैं इस आदेश के साथ एक फ़ाइल लोड करने की कोशिश कर रहा हूँ, लेकिन कुछ नहीं कर रहा।

कैसे के बारे में अगर मैं csv में एक कॉलम को अनदेखा करना चाहूंगा?
मारसी-मैन

कैसे मेरे सीएसवी स्थानीय फ़ाइल के लिए अनुमति देने के लिए mysql सर्वर एडब्ल्यूएस पर चल रहा है (आरडीएस) द्वारा पहुँचा जा करने के लिए
राहुल

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 ','... ' ... यह आंशिक रूप से दोहरे उद्धृत CSVs के साथ भी काम करता है।
जोएल मेलन

3
मुझे लगता है कि आपका मतलब है ENCLOSED BY '\"'... LINES TERMINATED BY '\r\n'विंडोज से सीएसवी का उपयोग करने पर भी बहुत से लोगों की आवश्यकता होगी । और अंत में, बैकटिक्स के साथ फ़ील्ड के नाम से बचना बुद्धिमानी की स्थिति में है:$columns .= "`$column` varchar(250)";
dlo

1
यह उत्तर स्वीकृत उत्तर की तुलना में बहुत बेहतर है। विशेष रूप से यह अनुमति देता है कि ओपी ने क्या मांगा, और मैं यह भी चाहता हूं: "डेटा की पहली पंक्ति का उपयोग स्तंभ नामों के रूप में किया जाए"। (मैं पायथन में एक स्क्रिप्ट पसंद करूंगा, इसलिए मुझे PHP स्थापित करने की आवश्यकता नहीं है, लेकिन इसे पोर्ट करना मुश्किल नहीं होना चाहिए।)
लार्स

2
@YumYumYum क्या आप अपनी समस्या के बारे में अधिक विस्तार से बता सकते हैं?
हॉकई

क्या मैं आपको बीयर खरीद सकता हूं?
जो '

4

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


मुझे वास्तव में आश्चर्य हुआ कि आपको इस कार्यक्षमता को प्राप्त करने के लिए phpadmin जैसे ऐड का उपयोग करना होगा, आपके उत्तर के लिए धन्यवाद
संतुष्ट करता है

तीस को मेरा दिन बना
मार्क

4

पहले डेटाबेस में एक ही संख्या में स्तंभों की एक तालिका बनाएं, जो सीएसवी फ़ाइल में हैं।

फिर निम्नलिखित क्वेरी का उपयोग करें

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

कैसे के बारे में अगर मैं csv में एक कॉलम को अनदेखा करना चाहूंगा?
मारसी-मैन

3

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

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

my.cnf कमांड को एडिट करना है

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  

3

यदि आप mysql को "mysql -u -p --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 कॉलम सीएसवी कॉलम से बिल्कुल मेल खाते हैं):

//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 स्टेटमेंट जेनरेट करना होगा।

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

यहाँ एक अजगर लिपि है जो (लगभग) काम करती है:

#!/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 के लिए अधिकतम कॉलम की संख्या पर ब्रेक लगता है। जब आप सक्षम हैं तो हाइव या HBase में जाने का समय आ गया है।


1

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

0

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-use-php-and-mysqb.html


0

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

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

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


0

TablePlus एप्लिकेशन का उपयोग करें: दाएं पैनल से तालिका के नाम पर राइट-क्लिक करें आयात चुनें ...> CSV से CSV फ़ाइल का चयन करें कॉलम मिलान की समीक्षा करें और आयात को पूरा करें!


-3

मेरे पास csv को mysql पर आयात करने के कई तरीके हैं, मैंने "data infile लोड करें", mysql कार्यक्षेत्र का उपयोग करें आदि शामिल हैं।

जब मैं mysql कार्यक्षेत्र आयात बटन का उपयोग करता हूं, तो पहले आपको अपने आप पर खाली तालिका बनाने की आवश्यकता होती है, प्रत्येक स्तंभ प्रकार को अपने आप सेट करें। नोट: आपको प्राथमिक कुंजी के रूप में अंत में आईडी कॉलम जोड़ना होगा, नॉट और ऑटो_इन्क्रिमेंट, अन्यथा आयात बटन बाद में दिखाई नहीं देगा। हालाँकि, जब मैं CSV फ़ाइल लोड करना शुरू करता हूं, तो कुछ भी लोड नहीं होता है, बग जैसा लगता है। मैं हार मानता हूं।

लकी, अब तक का सबसे अच्छा आसान तरीका है कि मैं एक्सेल के लिए ओरेकल के mysql का उपयोग करूं। आप इसे यहाँ से एक्सेल के लिए mysql डाउनलोड कर सकते हैं

यह आप क्या करने जा रहे हैं: एक्सेल में सीएसवी फ़ाइल खोलें, डेटा टैब पर, एक्सेल बटन के लिए mysql ढूंढें

सभी डेटा का चयन करें, mysql में निर्यात पर क्लिक करें। प्राथमिक कुंजी के रूप में एक आईडी कॉलम सेट करने के लिए ध्यान दें।

समाप्त होने पर, तालिका को बदलने के लिए mysql कार्यक्षेत्र पर जाएं, जैसे कि मुद्रा प्रकार को नियमित उपयोग के लिए बड़ी राशि दशमलव (10,2) के लिए दशमलव (19,4) होना चाहिए। अन्य फ़ील्ड प्रकार को varchar (255) पर सेट किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.