SQLite में लोड .sql या .csv फ़ाइल को कैसे आयात करें?


115

मुझे SQLite में .sql या .csv फ़ाइल डंप करने की आवश्यकता है (मैं SQLite3 एपीआई का उपयोग कर रहा हूं)। मैंने केवल तालिकाओं को आयात / लोड करने के लिए दस्तावेज़ीकरण पाया है, पूरे डेटाबेस को नहीं। अभी, जब मैं टाइप करता हूं:

sqlite3prompt> .import FILENAME TABLE 

मुझे एक सिंटैक्स त्रुटि मिलती है, क्योंकि यह तालिका की अपेक्षा कर रहा है और संपूर्ण डीबी नहीं।


जवाबों:


162

SQL फ़ाइल से आयात करने के लिए निम्नलिखित का उपयोग करें:

sqlite> .read <filename>

CSV फ़ाइल से आयात करने के लिए आपको फ़ाइल प्रकार और गंतव्य तालिका निर्दिष्ट करनी होगी:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>

2
यह सही उत्तर है, लेकिन कभी-कभी यह कायरता / टूटी हुई सीएसवी फ़ाइलों पर चुटकी लेता है।
एली

यह "db.sql को नहीं खोल सकता" त्रुटि दे रहा है, जब मैं। Com का उपयोग कर रहा हूँ।
डोर

2
यह स्तंभ नाम कैसे प्राप्त करता है, अगर वे सीएसवी फ़ाइल में मौजूद नहीं हैं?
sumanth232

@ krishna222, प्रलेखन के अनुसार , यदि तालिका मौजूद नहीं है, तो CSV की पहली पंक्ति को स्तंभ नामों के रूप में उपयोग किया जाएगा; यदि तालिका मौजूद है, तो सभी पंक्तियों को डेटा के रूप में माना जाता है।
१२

26

इसे कमांड से करने का प्रयास करें जैसे:

cat dump.sql | sqlite3 database.db

यह स्पष्ट रूप से केवल SQL स्टेटमेंट्स के साथ dip.sql में काम करेगा। मुझे यकीन नहीं है कि सीएसवी कैसे आयात करें।


मुझे लगता है कि यह सिर्फ एक ही काम करेगा, लेकिन उपयोगकर्ता को यह सुनिश्चित करना होगा कि sqlite3 सेटिंग्स के लिए सेट किया गया था.mode csv
FilBot3

बस यहाँ एक टिप्पणी करना चाहते हैं, यह वास्तव में 100% पर मृत है, sqlite3 database.db < dump.sqlSOOOO धीमी है !!! इसलिए cat dump.sql | sqlite3 database.dbइसके बजाय उपयोग करें ! : डी
जेवियर बूज़ी

@JavierBuzzi: क्षमा करें, लेकिन इसका कोई मतलब नहीं है। वे दो विधियाँ समतुल्य हैं। जब आप एक विधि या दूसरे को आजमाते हैं तो आपके पास कुछ और होता है। स्थिर परीक्षण स्थितियों के तहत मैं गारंटी देता हूं कि कोई गति अंतर नहीं होगा।
इकारसएनएम

22

एक तालिका में CSV आयात करने के लिए SQLite DB के साथ SCRATCH से जाने के लिए:

  • वेबसाइट से SQLite प्राप्त करें।
  • कमांड प्रॉम्प्ट पर चलाएं sqlite3 <your_db_file_name> * पर इसे एक खाली फाइल के रूप में बनाया जाएगा।
  • अपने नए डेटाबेस में एक नई तालिका बनाएं। आयात के लिए तालिका को आपके CSV फ़ील्ड से मेल खाना चाहिए।
  • आप इसे SQL कमांड द्वारा करते हैं: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

एक बार जब आपके पास तालिका बन जाती है और कॉलम फ़ाइल से आपके डेटा से मेल खाता है तो आप उपरोक्त कार्य कर सकते हैं ...

.mode csv <table_name>
.import <filename> <table_name>

@jacob सिर्फ फी, यह जवाब लगभग 4 साल पुराना है और जिस व्यक्ति ने इसे पोस्ट किया है वह यहां तीन साल से अधिक समय से नहीं है।
एंड्रयू बार्बर

आपने मेरे हफ्तों को बचाया। मैंने अपना काम 3 सेकंड में पूरा किया। मैंने 120 एमबी सीएसवी फ़ाइल को मात्र 5 सेकंड में .db में बदल दिया।
zackygaurav

11

Sqlite3 .import कमांड साधारण सीएसवी डेटा के लिए काम नहीं करेगा क्योंकि यह किसी कॉमा को कोट किए गए स्ट्रिंग में भी सीमांकक के रूप में मानता है।

इसमें शेल द्वारा बनाई गई csv फ़ाइल को फिर से आयात करने की कोशिश करना शामिल है:

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

ऐसा लगता है कि हमें csv को सम्मिलित कथनों की सूची में बदलना चाहिए, या शायद एक अलग परिसीमन काम करेगा।

SuperUser में मैंने csv फ़ाइलों से निपटने के लिए LogParser का उपयोग करने का सुझाव देखा, मैं उस पर गौर करने जा रहा हूँ।


blairxy: आपको जो त्रुटि मिल रही है, वह "अरे, तुम!" में अल्पविराम के कारण है। दूसरी पंक्ति लोड करते समय Sqlite 3 कॉलम देखता है और 2nd अल्पविराम को हटाने पर आप इसे बिना किसी त्रुटि के लोड कर सकते हैं।
शिव

10

यदि आप एक (अजगर) स्क्रिप्ट का उपयोग करने के लिए खुश हैं तो एक अजगर स्क्रिप्ट है जो इस पर स्वचालित करता है: https://github.com/rgrp/csv2sqlite

यह आपके लिए तालिका को ऑटो-क्रिएट करेगा और साथ ही आपके लिए कुछ बुनियादी प्रकार-अनुमान और डेटा कास्टिंग करेगा (इसलिए जैसे यह काम करेगा कुछ एक नंबर है और कॉलम प्रकार को "वास्तविक" पर सेट करें)।


लगभग काम करता है - शीर्ष लेख पंक्ति ठीक आयात करती है। हालाँकि तब मुझे sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings# csv2sqlite.py {csv-file-path} {sqlite-db-path} [{टेबल-नेम}] मिलता है
मार्कोस

हम्म, मैं इस त्रुटि का उपयोग करते हुए कभी नहीं देखा है। क्या आप गैर-यूनिकोड या गैर-यूटीएफ 8 डेटा का उपयोग कर रहे थे? यदि हां, तो आपको उस विशिष्ट एन्कोडिंग का उपयोग करके CSV फ़ाइल को खोलने के लिए स्क्रिप्ट को ट्वीक करने की आवश्यकता हो सकती है।
रुफस पोलक

उसी समय के आसपास, मैंने एक रूबी स्क्रिप्ट लिखी जो समान काम करती है !! यह भी एक ही बार में कई CSV फ़ाइलों पर काम करना चाहिए, फ़ाइल नाम से तालिका नाम का अनुमान लगा रहा है। github.com/dergachev/csv2sqlite
Dergachev

हमें sys.stdin से पढ़ने की आवश्यकता होगी क्योंकि हमें एक 60GB csv.gz फ़ाइल को बदलने की आवश्यकता है। या, csv2sqlite में gzip रीड सपोर्ट पाने का मौका मिलेगा? धन्यवाद!
15

@markusN ने github ट्रैकर पर एक मुद्दा खोला। आम तौर पर, मुझे sqlite में 100GB + CSV फ़ाइल के बारे में चिंता होगी (क्या आपके पास "उचित" आरडीबी के बारे में है जैसे कि पोस्टग्रैज या यहां तक ​​कि बड़े वर्ग, रेडशिफ्ट आदि
रुफस पोलक


1

SQLite बेहद लचीला है क्योंकि यह SQL सिंटैक्स में SQLite के विशिष्ट डॉट कमांड की अनुमति देता है , (हालांकि उन्हें CLI द्वारा व्याख्या की जाती है।) इसका मतलब है कि आप इस तरह की चीजें कर सकते हैं।

smsइस तरह एक तालिका बनाएँ :

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

फिर दो फाइलें:

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

SQL फ़ाइल का उपयोग करके CSV फ़ाइल के आयात का परीक्षण करने के लिए, चलाएँ:

# sqlite3 -csv -header mycool.db '.read test.sql'

अंत में, इसका मतलब है कि आप .importSQLite SQL में स्टेटमेंट का उपयोग कर सकते हैं , जैसा कि आप किसी अन्य RDB में कर सकते हैं, जैसे MySQL के साथ LOAD DATA INFILEआदि। हालांकि, यह अनुशंसित नहीं है।


1

शर्तें देखें। https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

यह कमांड लाइन पर SQL में टेक्स्ट को कनवर्ट करता है। (CSV सिर्फ पाठ है)

उदाहरण:

cat textfile | termsql -o sqlite.db

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

cat textfile | termsql -d ',' -o sqlite.db

वैकल्पिक रूप से आप ऐसा कर सकते हैं:

termsql -i textfile -d ',' -o sqlite.db

डिफ़ॉल्ट रूप से यह कॉलम नाम "COL0", "COL1" उत्पन्न करेगा, यदि आप चाहते हैं कि यह आपके लिए स्तंभ नामों के लिए पहली पंक्ति का उपयोग करें:

termsql -i textfile -d ',' -1 -o sqlite.db

यदि आप ऐसा करना चाहते हैं, तो आप कस्टम कॉलम नाम सेट करना चाहते हैं:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db

1

यदि आप इसे विंडोज़ में उपयोग कर रहे हैं, तो सुनिश्चित करें कि db को "" में पथ जोड़ना है और यह सुनिश्चित करने के लिए पथ में डबल स्लैश \ _ का उपयोग करें कि विंडोज़ इसे समझता है।


0

यह है कि आप एक पहचान कॉलम में कैसे सम्मिलित कर सकते हैं:

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt C: \ code \ db \ predefined \ में एक फ़ाइल है

data.db C: \ code \ db \ में है

myfile.txt में newline वर्ण द्वारा अलग किए गए तार हैं।

यदि आप अधिक कॉलम जोड़ना चाहते हैं, तो पाइप चरित्र का उपयोग करके उन्हें अलग करना आसान है, जो कि डिफ़ॉल्ट है।


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