মাইএসকিএল টেবিলটিতে সিএসভি আমদানি করুন


96

মাইএসকিএল টেবিলটিতে সিএসভি ফাইল আপলোড করার সবচেয়ে ভাল / দ্রুততম উপায় কী? আমি প্রথম সারির ডেটা কলামের নাম হিসাবে ব্যবহার করতে চাই।

এটি পাওয়া গেছে:

মাইএসকিউএল টেবিলে কীভাবে সিএসভি ফাইল আমদানি করবেন

তবে একমাত্র উত্তরটি ছিল জিইউআই ব্যবহার করা এবং শেল নয়?


4
এমনকি জিইউআই সলিউশনও সিএসভি থেকে কলামের নাম নেয় না ... আপনাকে আমদানির আগে পুরো টেবিলটি তৈরি করতে হবে-
ডোমিনিক

প্রশ্নের ইতিমধ্যে এখানে উত্তর রয়েছে stackoverflow.com/questions/3635166/…
ডেভিড

আপনি যে প্রশ্নের সাথে সংযোগ দিচ্ছেন তার উত্তর গৃহীত হয়েছিল একটি জিইউআই ব্যবহার করছে। আপনি যে উত্তরটি রেফারেন্স করছেন তা গতকাল সরবরাহ করা হয়েছিল যখন এই প্রশ্নটি (উত্তর) 2012 থেকে এসেছে
lcm

উত্তর:


147

কোনও সিএসভি ফাইল থেকে তথ্য টানতে স্ক্রিপ্ট লেখার পরিবর্তে আপনি এমওয়াইএসকিউএলকে সরাসরি এটিতে লিঙ্ক করতে পারেন এবং নিম্নলিখিত এসকিউএল সিনট্যাক্স ব্যবহার করে তথ্য আপলোড করতে পারেন।

মাইএসকিউএলে একটি এক্সেল ফাইল আমদানি করতে প্রথমে এটি একটি সিএসভি ফাইল হিসাবে রফতানি করুন। এক্সেল সিএসভি ফাইলের শেষে রেখেছিল খালি ডেটা সহ উত্পন্ন সিএসভি ফাইল থেকে সিএসভি শিরোনামগুলি সরান।

এরপরে আপনি এটি চালিয়ে একটি মাইএসকিউএল টেবিলের মধ্যে আমদানি করতে পারেন:

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

যেমনটি পড়েছেন: সরাসরি মাইএসকিউএলে সিএসভি ফাইল আমদানি করুন

সম্পাদনা

আপনার ক্ষেত্রে, প্রথম সারিটি সন্ধান করার জন্য এবং তাদের কলামের নাম হিসাবে নির্ধারণের জন্য আপনাকে প্রথমে একটি দোভাষী লিখতে হবে।


সম্পাদনা -২

মাইএসকিউএল ডক্স থেকে উপর 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)

8
প্রথম লাইনটি সরানোর পরিবর্তে আপনি IGNORE 1 LINESক্যোয়ারিতে যুক্ত করতে পারেন
এমবি 14

আপনি কি জানেন যে সিএসভি ফাইলের জন্য ফাইল পাথ সেট করার কোনও উপায় আছে?
জেসনডাভিস

এই কমান্ডটি ব্যর্থ হলে কীভাবে ডিবাগ করবেন? আমি এই কমান্ড দিয়ে একটি ফাইল লোড করার চেষ্টা করছি কিন্তু এটি কিছুই করছে না।

4
আমি কীভাবে সিএসভিতে একটি কলাম উপেক্ষা করতে চাই?
মারসি-ম্যান

আমার CSV স্থানীয় ফাইল জন্য অনুমতি দেওয়া মাইএসকিউএল সার্ভার আওস চলমান (RDS) দ্বারা অ্যাক্সেস করা
রাহুল

24

এখানে একটি সাধারণ পিএইচপি কমান্ড লাইন স্ক্রিপ্ট যা আপনার যা প্রয়োজন তা করবে:

<?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

4
দুর্দান্ত স্ক্রিপ্ট ডবল উদ্ধৃত CSV ফাইল যাদের জন্য (অধিকাংশ লোক পড়ুন) `মধ্যে encased '\"' 'যোগ করার জন্য fields terminated by ','... এটা এমনকি আংশিকভাবে ডবল উদ্ধৃত CSVs সাথে কাজ করে।
জোএল মেলন

4
আমি মনে করি আপনার অর্থ ENCLOSED BY '\"'... এছাড়াও, LINES TERMINATED BY '\r\n'যদি উইন্ডোজ থেকে কোনও সিএসভি ব্যবহার করা হয় তবে প্রচুর লোকের প্রয়োজন হবে । এবং অবশেষে, ব্যাকটিকস সহ মাঠের নামগুলি ছেড়ে যাওয়া যদি জায়গা থাকে তবে বুদ্ধিমানের কাজ হবে:$columns .= "`$column` varchar(250)";
dlo

4
এই উত্তর গৃহীত উত্তরের চেয়ে অনেক ভাল। বিশেষত এটি ওপি যা চেয়েছিল তা মঞ্জুরি দেয় এবং আমি এটিও চাই: "প্রথম সারির ডেটা কলামের নাম হিসাবে ব্যবহার করা হবে"। (আমি পাইথনের একটি স্ক্রিপ্ট পছন্দ করবো, সুতরাং আমাকে পিএইচপি ইনস্টল করতে হবে না, তবে এটির বন্দর করা শক্ত হওয়া উচিত নয়)
লার্শ

4
@ ইউয়াম ইউয়াম আপনি যে সমস্যাটি নিয়ে যাচ্ছেন সে সম্পর্কে আপনি আরও বিস্তারিত বলতে পারবেন?
হক্কি

আমি কি তোমাকে বিয়ার কিনতে পারি?
জো

4

আপনার যদি phpadmin ইনস্টল করার ক্ষমতা থাকে তবে একটি আমদানি বিভাগ রয়েছে যেখানে আপনি আপনার ডাটাবেসে সিএসভি ফাইলগুলি আমদানি করতে পারবেন সেখানে ফাইলের প্রথম লাইনে শিরোলেখ সেট করার জন্য একটি চেকবাক্স রয়েছে টেবিলের কলামের নামগুলি (এটি যদি চেক না করা হয় তবে) প্রথম লাইন ডেটা অংশ হয়ে যাবে


আমি সত্যিই অবাক হয়েছি যে এই কার্যকারিতাটি পেতে আপনাকে phpadmin এর মতো অ্যাড-অন ব্যবহার করতে হবে, আপনার উত্তরের জন্য ধন্যবাদ
ক্রিসফস

এটি সবেমাত্র আমার দিনটি তৈরি করেছে
চিহ্নিত করুন

4

প্রথমে সিএসভি ফাইলে থাকা একই সংখ্যক কলাম সহ ডাটাবেসে একটি সারণী তৈরি করুন।

তারপরে নিম্নলিখিত কোয়েরি ব্যবহার করুন

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

আমি কীভাবে সিএসভিতে একটি কলাম উপেক্ষা করতে চাই?
মারসি-ম্যান

3

পাঠ্য ফাইল বা সিএসভি ফাইল থেকে ডেটা লোড করতে কমান্ডটি দেওয়া হয়

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

উপরের কমান্ডে, আমার ক্ষেত্রে কেবল একটি কলাম লোড হওয়ার মতো তাই কোনও "সমাপ্তি" এবং "দ্বারা আবদ্ধ" নেই তাই আমি এটি খালি রেখেছি অন্যথায় প্রোগ্রামার পৃথকীকরণের অক্ষরে প্রবেশ করতে পারে। যেমন। , (কমা) বা "বা" বা যে কোনও জিনিস।

** যারা 5 বা ততোধিক বয়সী এবং আরও বেশি MySQL সংস্করণ ব্যবহার করছেন তাদের জন্য

ফাইলটি mysql এ লোড করার আগে অবশ্যই নিশ্চিত করতে হবে যে নীচে টাউ লাইনটি পাশাপাশি যুক্ত করা হয়েছে etc/mysql/my.cnf

my.cnf সম্পাদনা করতে কমান্ড হয়

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  

3

যদি আপনি "mysql -u -p --local-infile" হিসাবে mysql শুরু করেন তবে এটি দুর্দান্ত কাজ করবে


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 শিরোলেখগুলি পান যাতে আপনি কীভাবে আমদানি করবেন মাইএসকিএলকে বলতে পারেন (দ্রষ্টব্য: নিশ্চিত করুন যে আপনার মাইএসকিএল কলামগুলি সিএসভি কলামগুলির সাথে ঠিক মেলে):

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

তারপরে আপনার ক্যোয়ারীটি মাইএসকিএল সার্ভারে প্রেরণ করুন:

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

আমি কিছু সময়ের জন্য এটি সঙ্গে কুস্তি। সমস্যাটি কীভাবে ডেটা লোড করতে হয় তা নয়, তবে এটি কীভাবে টেবিলটি ধরে রাখার জন্য তৈরি করা যায়। ডেটা আমদানির আগে টেবিলটি তৈরি করতে আপনাকে অবশ্যই একটি ডিডিএল বিবৃতি উত্পন্ন করতে হবে।

বিশেষত কঠিন যদি টেবিলটিতে প্রচুর পরিমাণে কলাম থাকে।

এখানে একটি অজগর স্ক্রিপ্ট রয়েছে যা (প্রায়) কাজটি করে:

#!/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'

সমস্যার সমাধান করার জন্য এটি যে সমস্যাটি ফেলে যায় তা হ'ল চূড়ান্ত ক্ষেত্রের নাম এবং ডেটা টাইপ ঘোষণাটি কমা দিয়ে শেষ করা হয় এবং মাইএসকিউএল পার্সার এটি সহ্য করে না।

অবশ্যই এটিতেও সমস্যা আছে যে এটি প্রতিটি ক্ষেত্রের জন্য পাঠ্য ডেটা টাইপ ব্যবহার করে। যদি টেবিলটির বেশ কয়েকটি শতাধিক কলাম রয়েছে, তবে VARCHAR (64) সারণীটি আরও বড় করে তুলবে।

এটি মাইএসকিউএল-র সর্বাধিক কলাম গণনা ভঙ্গ করে বলে মনে হচ্ছে। আপনি যদি সক্ষম হন তবে হিভ বা এইচবিতে স্থানান্তরিত হওয়ার সময় এটিই।


1

এখানে আমি কিভাবে এটা পাইথন করেছিল ব্যবহার CSV এবং মাইএসকিউএল সংযোগকারী :

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 বিকল্পের ।
  • যদি 255 যথেষ্ট চওড়া নয় আপনি সন্নিবেশ ত্রুটিগুলি পেতে এবং নতুন করে শুরু করতে হবে।
  • কলামের ধরণগুলি সমন্বয় করুন, যেমন ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • একটি প্রাথমিক কী যুক্ত করুন , যেমনALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

মাইএসকিএল সারণীতে 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-used-php-and-mysql.html


0

অন্যরা যেমন উল্লেখ করেছে, লোড ডেটা লোকাল ইনফাইলে ঠিক ঠিক কাজ করে। আমি হককি পোস্ট করা পিএইচপি স্ক্রিপ্টটি চেষ্টা করেছিলাম, তবে আমার পক্ষে কাজ করে নি। এটি ডিবাগ করার চেয়ে আমি এখানে যা করেছি তা এখানে:

1) CSV ফাইলের শিরোনাম সারিটি একটি টেক্সট ফাইলে কপি / পেস্ট করুন এবং ইম্যাক্স দিয়ে সম্পাদনা করুন। নিজস্ব লাইনে প্রতিটি পেতে প্রতিটি ক্ষেত্রের মধ্যে কমা এবং সিআর যুক্ত করুন।
2) ফিল্ডলিস্ট.টেক্সট হিসাবে ফাইলটি সংরক্ষণ করুন
3) প্রতিটি ক্ষেত্রের জন্য সংজ্ঞা অন্তর্ভুক্ত করার জন্য ফাইলটি সম্পাদনা করুন (বেশিরভাগ বর্ণচর ছিলেন, তবে বেশ কয়েকটি ইন্ট্রি (এক্স) ছিলেন) টেবিলের টেবিলের নামটি তৈরি করুন (ফাইলের শুরুতে এবং) ফাইলটির শেষের আকারে এটি SaveTable.sql
4 হিসাবে সংরক্ষণ করুন ) টেবিলটি তৈরি করতে ক্রিয়েটবেল.এসকিউএল ফাইল থেকে ইনপুট দিয়ে মাইএসকিএল ক্লায়েন্ট শুরু করুন) মাইএসকিএল ক্লায়েন্ট
শুরু করুন, আমার সারণীটি সাবস্ক্রাইব করে 'লোড ডেটা ইনফাইল' কমান্ডের বেশিরভাগে অনুলিপি / পেস্ট করুন নাম এবং সিএসভি ফাইলের নাম। FieldList.txt ফাইলটিতে আটকান। ক্ষেত্র তালিকায় আটকানোর আগে 'আইগনোর 1 লাইন' অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন

প্রচুর কাজের মতো মনে হচ্ছে তবে ইম্যাকের সাহায্যে সহজ .....


0

টেবিলপ্লাস অ্যাপ্লিকেশনটি ব্যবহার করুন: ডান প্যানেল থেকে টেবিলের নামটিতে ডান ক্লিক করুন আমদানি চয়ন করুন ...> সিএসভি থেকে সিএসভি ফাইল চয়ন করুন কলামের মিলটি পর্যালোচনা করুন এবং আমদানি হিট করুন সম্পন্ন হয়েছে!


-3

আমার গুগল সার্চ করে সিএসভি আমদানি করার জন্য মাইএসকিএলকে অনেকগুলি উপায় রয়েছে, "লোড ডেটা ইনফিল" অন্তর্ভুক্ত করে, মাইএসকিএল ওয়ার্কবেঞ্চ ব্যবহার করে ইত্যাদি to

আমি যখন মাইএসকিএল ওয়ার্কবেঞ্চ আমদানি বোতামটি ব্যবহার করি, প্রথমে আপনাকে নিজের খালি টেবিলটি তৈরি করতে হবে, প্রতিটি কলামের প্রকারটি নিজের মতো করে সেট করতে হবে। দ্রষ্টব্য: আপনাকে প্রাথমিক কী হিসাবে আইডি কলামটি যুক্ত করতে হবে এবং নাল এবং অটো_সংশোধন নয়, অন্যথায়, আমদানি বোতামটি পরে দেখা যাবে না। যাইহোক, আমি যখন সিএসভি ফাইল লোড করা শুরু করি তখন কিছুই বোঝা যায় না এটি বাগের মতো মনে হয়। আমি হাল ছেড়ে দিলাম।

ভাগ্যবান, এখন অবধি পাওয়া সবচেয়ে সহজ উপায় হ'ল এক্সেলের জন্য ওরাকল এর মাইএসকিএল ব্যবহার করা। আপনি এটিকে এক্সেল এর জন্য মাইএসকিএল থেকে ডাউনলোড করতে পারেন

এটি আপনি যা করতে যাচ্ছেন: এক্সেল এ সিএসভি ফাইল খুলুন, ডাটা ট্যাবে, এক্সেল বোতামের জন্য মাইএসকিএল সন্ধান করুন

সমস্ত ডেটা নির্বাচন করুন, মাইএসকিউএলে রফতানির জন্য ক্লিক করুন। প্রাথমিক কী হিসাবে একটি আইডি কলাম সেট করতে নোট।

সমাপ্তির পরে, টেবিলটি পরিবর্তন করতে মাইএসকিএল ওয়ার্কব্যাঞ্চে যান, যেমন নিয়মিত ব্যবহারের জন্য মুদ্রার ধরণটি বড় পরিমাণে দশমিক (10,2) এর জন্য দশমিক (19,4) হওয়া উচিত। অন্যান্য ক্ষেত্রের প্রকারটি বারচর (255) এ সেট করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.