2011-11-06 9 views
7

में डेटा आयात करें मेरे पास एक स्प्रेडशीट है जिसमें वास्तव में केवल एक जटिल तालिका है। मैं मूल रूप से स्प्रेडशीट को एक सीवी में परिवर्तित करता हूं और INSERT स्क्रिप्ट उत्पन्न करने के लिए एक ग्रोवी स्क्रिप्ट का उपयोग करता हूं।एक्सेल स्प्रेडशीट या सीवीएस से MySQL

हालांकि, मैं स्प्रेडशीट पर फ़ील्ड सीवीएस और भी जटिल में आयात कर में से कुछ के भीतर डेटा के साथ 28 क्षेत्रों है कि एक मेज के साथ ऐसा नहीं कर सकते। तो नए सीवीएस में खेतों को सही तरीके से अलग नहीं किया गया है या मेरी लिपि के लिए जिम्मेदार नहीं है।

किसी को भी एक बेहतर दृष्टिकोण पर किसी भी सुझाव यह करने के लिए है? धन्यवाद।

+0

कुछ कोड मददगार होगा – Ole

+0

यह करने के लिए बहुत समान प्रतीत होता है डेटा के 5,000 पंक्तियों तक फ़ाइलों के लिए नि: शुल्क है [3,621,798] (http://stackoverflow.com/questions/3621798) – arober11

+0

संभावित डुप्लिकेट [MySQL डेटाबेस में एक्सेल फ़ाइल को कैसे आयात करें] (http://stackoverflow.com/questions/1310166/how-to-import-a-excel-file-in-to-mysql-डेटाबेस) –

उत्तर

5

LOAD DATA INFILE बयान पर एक नज़र डालें। यह आपको CSV फ़ाइल से डेटा में डेटा आयात करने में मदद करेगा।

0

कुछ समय पहले मैं EE साइट पर एक बहुत ही इसी तरह के सवाल का जवाब दे, और पर्ल के निम्नलिखित ब्लॉक की पेशकश की, तुम कैसे सीधे MySQL में एक एक्सेल शीट लोड कर सकता है की एक त्वरित और गंदे उदाहरण के रूप में। सीएसवी के माध्यम से निर्यात/आयात करने की आवश्यकता को छोड़कर और उम्मीद है कि उन विशेष पात्रों में से अधिक को संरक्षित करना, और सामग्री से बचने के बारे में चिंता करने की आवश्यकता को समाप्त करना।

#!/usr/bin/perl -w 
# Purpose: Insert each Worksheet, in an Excel Workbook, into an existing MySQL DB, of the same name as the Excel(.xls). 
#   The worksheet names are mapped to the table names, and the column names to column names. 
#   Assumes each sheet is named and that the first ROW on each sheet contains the column(field) names. 
# 

use strict; 
use Spreadsheet::ParseExcel; 
use DBI; 
use Tie::IxHash; 

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV; 

my $sDbName    = $ARGV[0]; 
    $sDbName    =~ s/\.xls//i; 
my $oExcel    = new Spreadsheet::ParseExcel; 
my $oBook    = $oExcel->Parse($ARGV[0]); 
my $dbh     = DBI->connect("DBI:mysql:database=$sDbName;host=192.168.123.123","root", "xxxxxx", {'RaiseError' => 1,AutoCommit => 1}); 
my ($sTableName, %hNewDoc, $sFieldName, $iR, $iC, $oWkS, $oWkC, $sSql); 

print "FILE: ", $oBook->{File} , "\n"; 
print "DB: $sDbName\n"; 
print "Collection Count: ", $oBook->{SheetCount} , "\n"; 

for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) 
{ 
$oWkS     = $oBook->{Worksheet}[$iSheet]; 
$sTableName    = $oWkS->{Name}; 
print "Table(WorkSheet name):", $sTableName, "\n"; 
for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) 
{ 
    tie (%hNewDoc, "Tie::IxHash"); 
    for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) 
    { 
    $sFieldName   = $oWkS->{Cells}[$oWkS->{MinRow}][$iC]->Value; 
    $sFieldName   =~ s/[^A-Z0-9]//gi; #Strip non alpha-numerics from the Column name 
    $oWkC     = $oWkS->{Cells}[$iR][$iC]; 
    $hNewDoc{$sFieldName} = $dbh->quote($oWkC->Value) if($oWkC && $sFieldName); 
    } 
    if ($iR == $oWkS->{MinRow}){ 
     #eval { $dbh->do("DROP TABLE $sTableName") }; 
     $sSql    = "CREATE TABLE IF NOT EXISTS $sTableName (".(join " VARCHAR(512), ", keys (%hNewDoc))." VARCHAR(255))"; 
     #print "$sSql \n\n"; 
     $dbh->do("$sSql"); 
    } else { 
     $sSql = "INSERT INTO $sTableName (".(join ", ",keys (%hNewDoc)).") VALUES (".(join ", ",values (%hNewDoc)).")\n"; 
     #print "$sSql \n\n"; 
     eval { $dbh->do("$sSql") }; 
    } 
} 
print "Rows inserted(Rows):", ($oWkS->{MaxRow} - $oWkS->{MinRow}), "\n"; 
} 
# Disconnect from the database. 
$dbh->disconnect(); 

नोट:

  1. बदलें कनेक्शन ($ oConn) स्ट्रिंग सूट करने के लिए, और यदि आवश्यक हो बहस करने के लिए एक उपयोगकर्ता के आईडी और पासवर्ड जोड़ें।
  2. यदि आपको XLSX समर्थन की आवश्यकता है तो स्प्रेडशीट :: XLSX पर त्वरित स्विच सभी आवश्यक है। वैकल्पिक रूप से यह केवल कोड की कुछ पंक्तियां लेता है, फ़ाइल प्रकार का पता लगाने और उपयुक्त पुस्तकालय को कॉल करें।
  3. ऊपर एक सरल हैक है, मान लिया गया एक सेल में सब कुछ एक स्ट्रिंग /अदिश है, अगर संरक्षण प्रकार महत्वपूर्ण है, एक कुछ regexp साथ एक छोटी सी समारोह में कुछ के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, तो के बयानों संख्या सुनिश्चित/दिनांक, लागू प्रारूप में रहते हैं जब डीबी
  4. उपरोक्त कोड, CPAN मॉड्यूल की एक संख्या पर निर्भर करता है आप, स्थापित कर सकते हैं कि आउटबाउंड एफ़टीपी पहुँच संभालने की अनुमति दी है के लिए लिखा एक के माध्यम से:

    cpan YAML डेटा :: डम्पर स्प्रेडशीट :: ParseExcel टाई :: IxHash Encode Scalar :: फ़ाइल तक :: बेसनाम डीबीडी :: mysql

निम्नलिखित लाइनों के साथ कुछ लौट जाना चाहिए (TIS बल्कि धीमी गति से, ऑटो की वजह से प्रतिबद्ध):

# ./Excel2mysql.pl test.xls 
FILE: test.xls 
DB: test 
Collection Count: 1 
Table(WorkSheet name):Sheet1 
Rows inserted(Rows):9892 
2

इस stackoverflow पर एक आवर्ती सवाल है। यहां एक अद्यतन उत्तर है।

जटिलता और सफलता की विभिन्न डिग्री के साथ एक MySQL डेटाबेस में एक्सेल फ़ाइल आयात करने के कई तरीके हैं।

  1. Excel2MySQL या Navicat उपयोगिताओं। पूर्ण प्रकटीकरण, मैं Excel2MySQL का लेखक हूं। ये 2 उपयोगिताएं निःशुल्क नहीं हैं, लेकिन वे सबसे आसान विकल्प हैं और कम सीमाएं हैं। वे एक्सेल डेटा को MySQL में आयात करने में सहायता के लिए अतिरिक्त सुविधाएं भी शामिल करते हैं।उदाहरण के लिए, Excel2MySQL स्वचालित रूप से आपकी तालिका बनाता है और स्वचालित रूप से फ़ील्ड डेटा प्रकारों जैसे दिनांक, समय, फ्लोट इत्यादि को अनुकूलित करता है। यदि आप जल्दी से या अपने डेटा के साथ काम करने के लिए अन्य विकल्प नहीं प्राप्त कर सकते हैं तो ये सुविधाएं आपकी आवश्यकताओं के अनुरूप हो सकती हैं।

    screenshot of Excel2MySQL

  2. LOAD DATA INFILE: यह लोकप्रिय विकल्प शायद सबसे तकनीकी है और MySQL आदेश निष्पादन के कुछ समझने की आवश्यकता है। लोड करने और उचित रूप से आकार वाले VARCHAR फ़ील्ड प्रकारों का उपयोग करने से पहले आपको मैन्युअल रूप से अपनी तालिका बनाना होगा। इसलिए, आपके फ़ील्ड डेटा प्रकार अनुकूलित नहीं हैं। लोड डेटा इन्फाइल को बड़ी फ़ाइलों को आयात करने में परेशानी है जो 'max_allowed_packet' आकार से अधिक है। विशेष पात्रों और विदेशी यूनिकोड वर्णों को आयात करने में समस्याओं से बचने के लिए विशेष ध्यान देने की आवश्यकता है। यहां एक हालिया उदाहरण है जिसका उपयोग मैं test.csv नामक एक सीएसवी फ़ाइल आयात करने के लिए करता था।

    enter image description here

  3. phpMyAdmin: पहले अपने डेटाबेस का चयन करें, और फिर आयात टैब का चयन करें। phpMyAdmin स्वचालित रूप से आपकी तालिका बनायेगा और आपके VARCHAR फ़ील्ड का आकार देगा, लेकिन यह फ़ील्ड प्रकारों को अनुकूलित नहीं करेगा। phpMyAdmin को 'max_allowed_packet' आकार से अधिक बड़ी फ़ाइलों को आयात करने में समस्या है।

    enter image description here

  4. MySQL for Excel: यह एक नि: शुल्क Excel ऐड-इन ओरेकल से है। यह विकल्प थोड़ा कठिन है क्योंकि यह एक विज़ार्ड का उपयोग करता है और आयात बड़ी फ़ाइलों के साथ धीमा और छोटी है, लेकिन यह VARCHAR डेटा वाली छोटी फ़ाइलों के लिए एक अच्छा विकल्प हो सकता है। फ़ील्ड अनुकूलित नहीं हैं।

    enter image description here

+0

क्या Excel2Mysql सीधे एक सीएसवी फ़ाइल संभाल सकता है? मेरा सीएसवी एक्सेल में कनवर्ट करने के लिए बहुत बड़ा तरीका है। – ccleve

0

अल्पविराम से अलग मूल्यों के लिए (CSV) फ़ाइलों, परिणामों को देखने के Workbench में पैनल विकल्प है कि CSV डेटा परिणाम सेट में सीधे आयात करता है एक "बाहरी फ़ाइल से आयात रिकॉर्ड" है। निष्पादित करें और परिवर्तन करने के लिए "लागू करें" पर क्लिक करें।

एक्सेल फ़ाइलों के लिए, आधिकारिक MySQL for Excel plugin का उपयोग करने पर विचार करें।

3

मैं SQLizer https://sqlizer.io नामक उत्पाद पर काम करता हूं जो एक्सेल (और सीएसवी) फ़ाइलों को MySQL सम्मिलित कथन में परिवर्तित करता है जिसे डेटा डालने के लिए चलाया जा सकता है - या विभिन्न डीबी प्रबंधन प्रणालियों में चिपकाया जा सकता है।

SQLizer

यह

+0

दुर्भाग्य से मेरी कंपनी गोपनीयता चिंताओं के कारण एक ऑनलाइन उपकरण एक विकल्प नहीं है। – RandomGuy

+0

@RandomGuy समझा - यहां हमारी सुरक्षा पोस्ट है, फिर भी http://blog.sqlizer.io/posts/privacy-at-sqlizer/ हमारे पास अभी भी एक एपीआई है। –

संबंधित मुद्दे