মাইএসকিউএল সিএসভি ডেটা থেকে নুল মান লোড করে


167

আমার কাছে এমন একটি ফাইল রয়েছে যা 3 থেকে 4 কলাম পর্যন্ত সংখ্যার মানগুলিকে কমা দ্বারা পৃথক করা যায়। খালি ক্ষেত্রগুলি যখন সারিটির শেষে থাকে তখন ব্যতিক্রমগুলি দিয়ে সংজ্ঞায়িত করা হয়:

1,2,3,4,5
1,2,3,,5
1,2,3

নিম্নলিখিত টেবিলটি মাইএসকিউএলে তৈরি করা হয়েছিল:

+ + ------- + + -------- + + ------ + + ----- + + --------- + + ------- + +
| মাঠ | প্রকার | নাল | কী | ডিফল্ট | অতিরিক্ত |
+ + ------- + + -------- + + ------ + + ----- + + --------- + + ------- + +
| এক | int (1) | হ্যাঁ | | নুল | |
| দুই | int (1) | হ্যাঁ | | নুল | |
| তিন | int (1) | হ্যাঁ | | নুল | |
| চার | int (1) | হ্যাঁ | | নুল | |
| পাঁচ | int (1) | হ্যাঁ | | নুল | |
+ + ------- + + -------- + + ------ + + ----- + + --------- + + ------- + +

আমি মাইএসকিউএল লোড কমান্ডটি ব্যবহার করে ডেটা লোড করার চেষ্টা করছি:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

ফলাফল সারণী:

+ + ------ + + ------ + + ------- + + ------ + + ------ + +
| এক | দুই | তিন | চার | পাঁচ |
+ + ------ + + ------ + + ------- + + ------ + + ------ + +
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 0 | 5 |
| 1 | 2 | 3 | নুল | নুল |
+ + ------ + + ------ + + ------- + + ------ + + ------ + +

সমস্যাটি এই সত্যের সাথে সম্পর্কিত যে কোনও ক্ষেত্র যখন কাঁচা ডেটাতে খালি থাকে এবং সংজ্ঞায়িত হয় না তখন কোনও কারণে মাইএসকিউএল কলামগুলির ডিফল্ট মান (যা ন্যূনাল) ব্যবহার করে না এবং শূন্য ব্যবহার করে। ক্ষেত্রটি পুরোপুরি অনুপস্থিত থাকলে NULL সঠিকভাবে ব্যবহৃত হয়।

দুর্ভাগ্যক্রমে, আমাকে এই পর্যায়ে NULL এবং 0 এর মধ্যে পার্থক্য করতে সক্ষম হতে হবে যাতে কোনও সাহায্যের প্রশংসা করা যায়।

ধন্যবাদ এস।

সম্পাদন করা

শো সতর্কতাগুলির আউটপুট:

+ + --------- + + ------ + + -------------------------------- ------------------------ + +
| স্তর | কোড | বার্তা |
+ + --------- + + ------ + + -------------------------------- ------------------------ + +
| সতর্কতা | 1366 | ভুল পূর্ণসংখ্যার মান: সারি 2 | কলাম 'চার' এর জন্য ''
| সতর্কতা | 1261 | সারি 3 এ সমস্ত কলামের ডেটা নেই
| সতর্কতা | 1261 | সারি 3 এ সমস্ত কলামের ডেটা নেই
+ + --------- + + ------ + + -------------------------------- ------------------------ + +

ডেটা স্কিমা পরিবর্তনের সাথে আমি d6tstack ব্যবহার করব যা চলার আগে সমস্ত কলামকে সারিবদ্ধ করে LOAD DATA। ডেটা স্কিমা পরিবর্তনের উপর d6tstack এসকিউএল উদাহরণ বিভাগ দেখুন ।
সিটিএনরম্যান

উত্তর:


193

এটি আপনি যা চান তা করবে। এটি স্থানীয় ভেরিয়েবলের মধ্যে চতুর্থ ক্ষেত্রটি পড়বে এবং তারপরে যদি স্থানীয় ভেরিয়েবলটি খালি স্ট্রিং সহ শেষ হয়:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;

যদি সেগুলি সম্ভবত সমস্ত শূন্য থাকে, তবে আপনি সেগুলি সমস্ত ভেরিয়েবলগুলিতে পড়তে এবং একাধিক এসইটি বিবৃতি পাবেন, যেমন:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;

তাত্ত্বিকভাবে, আমি মনে করি - তবে এটি সমস্তই স্মৃতিশক্তি, এবং কেবল প্রতি সারিতে খুব অল্প পরিমাণে ডেটা রাখে, তাই আমি মনে করি এটি অনন্য হবে; তবে আপনি যদি মনে করেন এটি সমস্যা হতে পারে তবে আপনার এটি পরীক্ষা করা উচিত।
ডানকান লক

4
আমি এই উত্তরটি সত্যিই পছন্দ করি। ব্যবহারকারীরা খালি স্ট্রিং দেখতে পারেন ''যখন তারা একটি CSV ডাউনলোড করুন (ব্যবহার IFNULL(Col,'')মধ্যে SELECT INTO OUTFILEসীমা অতিক্রম করা জন্য আপনার জিজ্ঞাসিত প্রশ্নের) কিন্তু তারপর আপলোড সহ মোকাবেলা করতে হচ্ছে বনাম নাল যেমন তাদের গ্রহণ \NCSV হবে। ধন্যবাদ!
ক্রিসান

9
তারিখগুলির জন্য আমি 'নুলিফ (স্ট্রুকুয়েড আপডেট (@ তারিখ 1, "% ডি /% মি /% ওয়াই"), "0000-00-00")' "
জ্যাকউন এল

1
আমার একটি সিএসভি ফাইল রয়েছে যার মধ্যে জিরো রয়েছে 0যা রূপান্তরিত হওয়া উচিত NULL(কারণ প্রশ্নে থাকা ডেটার জন্য শূন্য মান পাওয়া সম্ভব নয়) এবং খালি স্ট্রিংও রয়েছে। জিরো এবং খালি দুটি স্ট্রিং রূপান্তরিত হয়েছে তা কীভাবে নিশ্চিত করবেন NULL?
পল রউজিগস

যদি শূন্য মান এবং খালি স্ট্রিংগুলি পৃথক কলামে থাকে, তবে খালি স্ট্রিংগুলির জন্য কেবল উপরের কাজটি করুন এবং শূন্যগুলির জন্য এর মতো কিছু করুন : nullif(@vone, 0).
ডানকান লক

136

মাইএসকিউএল ম্যানুয়াল বলেছেন:

লোড ডেটা ইনফিলের সাথে ডেটা পড়ার সময়, খালি বা অনুপস্থিত কলামগুলি '' দিয়ে আপডেট করা হয়। আপনি যদি একটি কলামে একটি নাল মান চান, আপনার ডাটা ফাইলে \ N ব্যবহার করা উচিত। আক্ষরিক শব্দ "নুল" কিছু পরিস্থিতিতে ব্যবহার করা যেতে পারে।

সুতরাং আপনাকে ফাঁকা স্থানগুলি এই জাতীয় with N এর সাথে প্রতিস্থাপন করতে হবে:

1,2,3,4,5
1,2,3,\N,5
1,2,3

3
টিপটির জন্য ধন্যবাদ - আমি কাঁচা উত্স ডেটা সম্পাদনা করতে সংশয়ী তবে এটি যদি কেবলমাত্র এটির চারপাশে থাকে তবে আমি এটি চেষ্টা করে দেখব।
স্পিরিস

7
আমি আপনার সংশয় বুঝি, কেউ কাঁচা তথ্য সম্পাদনা করতে পছন্দ করে না, এটি ঠিক সঠিক মনে হয় না। তবে, আপনি যদি এক মিনিটের জন্য এটির বিষয়ে চিন্তা করেন, তবে NUL এবং খালি স্ট্রিংয়ের মধ্যে পার্থক্য করার একটি উপায় থাকতে হবে। ফাঁকা এন্ট্রিগুলি NULL তে অনুবাদ করা উচিত, আপনার খালি স্ট্রিংয়ের জন্য একটি বিশেষ ক্রম দরকার। মাইএসকিউএলকে ফাঁকা এন্ট্রিগুলি কীভাবে আচরণ করা যায় তা বলার একটি উপায় থাকলে ভাল লাগবে, যদিও লোড ডেটা ইনফিল '/tmp/testdata.txt' ন্যূন হিসাবে টেবিলে কেবল চিকিত্সা ব্লকের ...
জানকি

2
ঠিক আছে, কিন্তু আপনি আছে যদি Fields enclosed by: "যে "\N"এর"name",\N,"stuff"
জোনাথন

3
আমি যাচাই করতে পারি যে কমপক্ষে "phpMyAdmin 3.5.5" এর জন্য কোনও স্টাইলই ডোনোটিং \Nহিসাবে গ্রহণ করা হয় না NULL। পরিবর্তে ব্যবহার করুন NULL, যেমন এই উদাহরণ হিসাবে:"name","age",NULL,"other","stuff"
জনাথন

1
আমাদের মাইএসকিউএল 5.5.46-0 + deb8u1 রয়েছে। আমি NULL এবং \ N উভয়ই চেষ্টা করেছি এবং কেবলমাত্র \ N আমাদের পক্ষে কাজ করেছে।
র‌্যাফেল 75

6

ডাটাবেস কনফিগারেশনের উপর নির্ভর করে আচরণটি আলাদা। কঠোর মোডে এটি একটি ত্রুটি অন্যথায় একটি সতর্কতা নিক্ষেপ করবে। নিম্নলিখিত কোয়েরিটি ডাটাবেস কনফিগারেশন সনাক্তকরণের জন্য ব্যবহৃত হতে পারে।

mysql> show variables like 'sql_mode';

ধন্যবাদ! আমি গতকাল প্রোডাকশন সার্ভারে সাফল্যের সাথে আমদানি করা খালি কলামগুলির সাথে কেন একটি সিএসভি আমদানি করা আমার ব্র্যান্ড-নতুন স্থানীয় ইনস্টলেশন নিয়ে কাজ করছিলাম না তা চেষ্টা করার জন্য আমি আমার মাথা আঁচড়াচ্ছিলাম - এটি আমার ক্ষেত্রে উত্তর ছিল!
এমা বুরোজ

3

আপনার ইনপুট সিএসভিকে \ N দিয়ে ফাঁকা এন্ট্রিগুলি প্রতিস্থাপন করতে প্রসেস করুন।

একটি রেজেক্সে চেষ্টা করুন: s / ,, /,, n, / জি এবং এস /, $ /, \ এন / জি

শুভকামনা।


1
এই রেজেক্সটি আংশিকভাবে কাজ করে, এটি অনুক্রমিক ফাঁকা এন্ট্রিগুলিকে সমাধান করে না, উদাহরণস্বরূপ ,,,,,, \ n ,,, n, আপনি যদি এটি দুটিবার চালনা করেন তবে ব্যবহারযোগ্য হবে
ievgen

1
উত্তর এবং পূর্ববর্তী মন্তব্য সংক্ষেপে হবে। নিম্নলিখিতটি আমার জন্য কাজ করেছে, ক্রমে: সেড-আই '/ /, /, \ এন / জি' $ ফাইল, সেড -i 's / ,, /, / জি' $ ফাইল, সেড-আই এর / \ এন, $ / \ এন / জি '$ ফাইল,
ওমর খাজমভ

আমি এটি করতে চাই তবে আপনি কীভাবে এই রেজেক্সটি চালাচ্ছেন তা সম্পর্কে আমি পরিষ্কার নই। আপনি যদি মাইএসকিউএলটি ফাইলটির বিরুদ্ধে চালানোর জন্য ব্যবহার করেন তবে এটি সেরা সমাধান হতে পারে। তবে আপনি বলবেন না এবং আমি এমন কিছু করতে কীভাবে সম্ভব হতে পারে তা গুগল করার জন্য একগুচ্ছ সময় ব্যয় করতে চাই না।
গাধা কং

1

(ভেরিয়েবল 1, @ ভেরিয়েবল 2, ..) সেট ভেরিয়েবল 2 = নুলিফ (@ ভেরিয়েবল 2, '' বা '') >> আপনি যে কোনও শর্ত রাখতে পারেন


0

ভেরিয়েবলগুলি দেখান

Show variables like "`secure_file_priv`";

দ্রষ্টব্য: আপনার সিএসভি ফাইলটিকে উপরের কমান্ডের দ্বারা প্রদত্ত স্থানে রাখুন।

create table assessments (course_code varchar(5),batch_code varchar(7),id_assessment int, assessment_type varchar(10), date int , weight int);

দ্রষ্টব্য: এখানে dateসিএসভি ফাইলে ' ' কলামটির কিছু ফাঁকা মান রয়েছে।

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/assessments.csv' 
INTO TABLE assessments
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(course_code,batch_code,id_assessment,assessment_type,@date,weight)
SET date = IF(@date = '', NULL, @date);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.