Theory
Marks एक spreadsheet के रूप में आते हैं
Faculty कभी INSERT statements type नहीं करेगी। ResultDesk के inbox में जो आता है वह dbms_marks.csv है, Excel से exported:
roll,subject,score
101,DBMS,78
102,DBMS,55
साठ rows। साठ INSERTs type करना एक workflow नहीं, एक सज़ा है।
sqlite3 shell पूरी file को दो commands में निगल सकता है, AGAR आप एक छोटी detail सही तरीक़े से handle करें: वह पहली line।
Theory
Delivery van और gate register
एक CSV file एक delivery van है: goods rows में stacked, ऊपर एक label sheet (header) यह बताती हुई हर column क्या ढो रहा है।
.import gate है: यह हर row आपकी table में उतारता है। Catch: अगर storeroom (table) अपने labels के साथ पहले से मौजूद है, van की label sheet gate के लिए बस एक और box है: यह data के रूप में shelved हो जाती है। Label sheet का क्या होता है यह decide करना ही import करने की पूरी skill है।
Theory
Two-command import
.mode csv shell के parser को comma-separated format में switch करता है (यह quoted fields को भी handle करता है जिनके अंदर commas हों)।
.import dbms_marks.csv marks file को table में पढ़ता है।
फिर सब कुछ target पर depend करता है:
- Table मौजूद नहीं है: .import इसे बनाता है, header line को column names के लिए इस्तेमाल करते हुए (सब TEXT)।
- Table मौजूद है: .import हर line को data के रूप में insert करता है, header समेत: एक bogus row ('roll', 'subject', 'score') आपकी table में उतरती है।
Follow along
Mौजूदा marks table में साफ़ तरीक़े से import कीजिए
- .mode csv Shell को बताइए आती हुई file comma-separated है।
- .import --csv --skip 1 dbms_marks.csv marks Modern SQLite: --skip 1 header row को jump करता है। (पुराने shells: import कीजिए, फिर DELETE FROM marks WHERE roll = 'roll'; bogus row हटाने के लिए।)
- SELECT COUNT(*) FROM marks; Verify कीजिए count बिल्कुल file की data rows से बढ़ा: van में 60 rows, 60 नई rows shelved।
- Types spot-check कीजिए: SELECT roll, score FROM marks LIMIT 3; एक EXISTING table में import की गई values इसकी affinities follow करती हैं; .import से CREATED एक table सब कुछ TEXT रखती है।
Quiz
एक student .mode csv फिर .import marks.csv marks EXISTING marks table में चलाता है, फिर data में एक row ('roll','subject','score') पाता है। क्यों?
- Header line एक data row के रूप में import हुई: EXISTING table में .import हर line को data मानता है
- Download के दौरान CSV file corrupt हो गई
- .mode csv हमेशा tables में एक title row जोड़ता है
- SQLite को बाद के exports के लिए headers store करने ज़रूरी हैं
Show the answer
Header line एक data row के रूप में import हुई: EXISTING table में .import हर line को data मानता है
जब target table पहले से मौजूद है, .import के पास line 1 को specially treat करने का कोई कारण नहीं: header किसी और row की तरह अंदर travel करता है, classic bogus record बनते हुए। Fixes: import पर --skip 1, पहले header strip करना, या बाद में bogus row DELETE करना। Options B से D behaviours invent करते हैं; header-as-data trap असली, common है, और बिल्कुल वही जो यह topic सिखाने के लिए मौजूद है।
Think first
Created table अंदाज़ा लगाइए
Table allmarks मौजूद NAHI है। आप .mode csv फिर .import all_terms.csv allmarks एक file पर चलाते हैं जिसका header roll,subject,score है। tap करने से पहले: क्या import काम करता है, allmarks को कौन से columns मिलते हैं, और score column के साथ catch क्या है?
Show the answer
यह काम करता है: .import allmarks create करता है, header से column names roll, subject, score लेते हुए (इस case में labels के रूप में इस्तेमाल, data के रूप में insert नहीं)।
Catch: हर column TEXT affinity के साथ बनता है: score '78' string रखता है, 78 number नहीं। SUM(score) conversion से अभी भी काम कर सकता है, पर ORDER BY '9' को '78' से ऊपर sort कर सकता है। Professional आदत: पहले ख़ुद typed table बनाइए, फिर इसमें --skip 1 के साथ import कीजिए।
Watch out
Import checklist जो exams reward करते हैं
1. .mode csv .import से PEHLE, वरना parser file ग़लत पढ़ता है।
2. मौजूदा table: header से निपटिए (--skip 1, pre-strip, या post-delete)।
3. .import से नई table: सभी columns TEXT: numbers को care चाहिए।
4. File की row count के ख़िलाफ़ COUNT(*) से verify कीजिए।
"आप CSV कैसे import करते हैं" जवाब में ये चार लिखिए और यह complete है।
Theory
CSV lingua franca है
इसके बाद जो भी tool आप मिलेंगे वह CSV बोलता है: Excel इसे export करता है, banks और exam boards इसे mail करते हैं, pandas इसे एक call से पढ़ता है (read_csv, Unit 4, जहाँ यह import shell के बजाय Python में होता है)। Header rule को एक बार यहाँ master कीजिए और यह हर tool में चुकाता है: सवाल हमेशा है "क्या line 1 labels है या data?"
Summary
Key takeaways
- CSV: plain-text rows, comma-separated, पहली line आमतौर पर एक header।
- Import = .mode csv, फिर .import file.csv table।
- मौजूदा table: हर line data बन जाती है, header समेत: इसे skip कीजिए (--skip 1) या bogus row delete कीजिए।
- Nayi table: .import इसे header से बनाता है, पर सभी columns TEXT हैं।
- हर import को SELECT COUNT(*) से verify कीजिए।
- Memory hook: delivery van की label sheet: labels या cargo?