به من اجازه دهید مقدمه این مقاله را با گفتن اینکه من یک فرد پایانی نیستم، مطرح کنم. من از Vim استفاده نمی کنم. پیدا می کنم sed
، grep
، و awk
پیچیده و ضد شهودی من ترجیح می دهم فایل هایم را در یک رابط کاربری خوب ببینم. با همه ی اینها، عادت کردم که به دنبالش بروم رابط های خط فرمان (CLI) زمانی که کارهای کوچک و اختصاصی برای انجام دادن داشتم. چرا؟ همه اینها را در زیر توضیح خواهم داد. در این مقاله، نحوه استفاده از ابزار CLI به نام را نیز یاد خواهید گرفت میلر برای دستکاری داده ها از فایل های CSV، TSV و/یا JSON.
چرا از خط فرمان استفاده کنیم؟
همه چیزهایی که در اینجا نشان می دهم را می توان با کدهای معمولی انجام داد. میتوانید فایل را بارگیری کنید، دادههای CSV را تجزیه کنید، و سپس آن را با استفاده از جاوا اسکریپت معمولی، پایتون یا هر زبان دیگری تبدیل کنید. اما چند دلیل وجود دارد که چرا هر زمان که نیاز به تبدیل دادهها داشته باشم، به رابطهای خط فرمان (CLI) مراجعه میکنم:
- خواندن راحت تر
(برای من) نوشتن یک اسکریپت در جاوا اسکریپت یا پایتون برای پردازش داده های معمول من سریعتر است. اما، بازگشت به یک فیلمنامه ممکن است گیج کننده باشد. با توجه به تجربه من، نوشتن دستکاری های خط فرمان در ابتدا سخت تر است، اما بعداً خواندن آن آسان تر است. - تکثیر راحت تر
با تشکر از مدیران بسته مانند Homebrew، نصب CLI ها بسیار ساده تر از گذشته است. نیازی به کشف نسخه صحیح Node.js یا Python نیست، مدیر بسته از آن برای شما مراقبت می کند. - خوب پیر می شود
در مقایسه با زبان های برنامه نویسی مدرن، CLI ها قدیمی هستند. آنها بسیار کندتر از زبان ها و چارچوب ها تغییر می کنند.
میلر چیست؟
دلیل اصلی اینکه من میلر را دوست دارم این است که یک ابزار مستقل است. ابزارهای بسیار خوبی برای دستکاری داده ها وجود دارد، اما هر ابزار دیگری که پیدا کردم بخشی از یک اکوسیستم خاص بود. ابزارهای نوشته شده در پایتون نیاز به دانستن نحوه استفاده دارند pip
و محیط های مجازی برای کسانی که در Rust نوشته شده بودند، این بود cargo
، و غیره.
علاوه بر این، سریع است. فایل های داده پخش می شوند، در حافظه نگهداری نمی شوند، به این معنی که شما می توانید انجام عملیات بر روی فایل های بزرگ بدون فریز کردن کامپیوتر شما.
به عنوان یک جایزه، میلر به طور فعال نگهداری می شود، جان کرل واقعاً در بالای روابط عمومی و مسائل نگه می دارد. بهعنوان یک توسعهدهنده، همیشه با دیدن یک پروژه منبع باز مرتب و نگهداریشده با مستندات عالی، احساس رضایتبخشی به من دست میدهد.
نصب و راه اندازی
- لینوکس:
apt-get install miller
یا هومبرو. - سیستم عامل مک:
brew install miller
با استفاده از Homebrew - پنجره ها:
choco install miller
استفاده كردن شکلاتی.
همین است، و اکنون باید آن را داشته باشید mlr
دستور موجود در ترمینال شما
اجرا کن mlr help topics
تا ببینم کار کرده یا نه این به شما دستورالعمل هایی را برای پیمایش اسناد داخلی ارائه می دهد. با این حال، شما نباید به آن نیاز داشته باشید. این آموزش برای همین است!
چگونه mlr
آثار
دستورات میلر به روش زیر عمل می کنند:
mlr [input/output file formats] [verbs] [file]
مثال: mlr --csv filter '$color != "red"' example.csv
بیایید ساختارشکنی کنیم:
--csv
فرمت فایل ورودی را مشخص می کند. این یک فایل CSV است.filter
کاری است که ما روی فایل انجام می دهیم که در مستندات “فعل” نامیده می شود. در این مورد، ما هر ردیفی را که فیلد ندارد فیلتر می کنیمcolor
تنظیم کنید"red"
. بسیاری از افعال دیگر مانندsort
وcut
که بعدا بررسی خواهیم کردexample.csv
فایلی است که ما در حال دستکاری آن هستیم.
بررسی اجمالی عملیات
ما می توانیم از آنها استفاده کنیم افعال برای اجرای عملیات خاص روی داده های خود. کارهای زیادی می توانیم انجام دهیم. بیایید کاوش کنیم.
داده ها
من از مجموعه داده استفاده خواهم کرد رتبه بندی IMDb برای سریال های تلویزیونی آمریکایی ایجاد شده توسط The Economist. می توانید آن را دانلود کنید اینجا یا آن را در مخزن برای این مقاله
توجه داشته باشید: برای اختصار، نام فایل را تغییر دادم mlr --csv head ./IMDb_Economist_tv_ratings.csv
به tv_ratings.csv
.
در بالا، اشاره کردم که هر دستور شامل یک عملیات یا فعل خاص است. بیایید اولین مورد خود را به نام یاد بگیریم head
. کاری که انجام می دهد این است که به جای چاپ کل فایل در کنسول، ابتدای فایل (“سر”) را به شما نشان می دهد.
می توانید دستور زیر را اجرا کنید:
`mlr --csv head ./tv_ratings.csv`
و این خروجی است که خواهید دید:
titleId,seasonNumber,title,date,av_rating,share,genres
tt2879552,1,11.22.63,2016-03-10,8.489,0.51,"Drama,Mystery,Sci-Fi"
tt3148266,1,12 Monkeys,2015-02-27,8.3407,0.46,"Adventure,Drama,Mystery"
tt3148266,2,12 Monkeys,2016-05-30,8.8196,0.25,"Adventure,Drama,Mystery"
tt3148266,3,12 Monkeys,2017-05-19,9.0369,0.19,"Adventure,Drama,Mystery"
tt3148266,4,12 Monkeys,2018-06-26,9.1363,0.38,"Adventure,Drama,Mystery"
tt1837492,1,13 Reasons Why,2017-03-31,8.437,2.38,"Drama,Mystery"
tt1837492,2,13 Reasons Why,2018-05-18,7.5089,2.19,"Drama,Mystery"
tt0285331,1,24,2002-02-16,8.5641,6.67,"Action,Crime,Drama"
tt0285331,2,24,2003-02-09,8.7028,7.13,"Action,Crime,Drama"
tt0285331,3,24,2004-02-09,8.7173,5.88,"Action,Crime,Drama"
خواندن این کمی سخت است، بنابراین بیایید با افزودن آن را برای چشم راحت کنیم --opprint
.
mlr --csv --opprint head ./tv_ratings.csv
خروجی حاصل به صورت زیر خواهد بود:
titleId seasonNumber title date av_rating share genres
tt2879552 1 11.22.63 2016-03-10 8.489 0.51 Drama,Mystery,Sci-Fi
tt3148266 1 12 Monkeys 2015-02-27 8.3407 0.46 Adventure,Drama,Mystery
tt3148266 2 12 Monkeys 2016-05-30 8.8196 0.25 Adventure,Drama,Mystery
tt3148266 3 12 Monkeys 2017-05-19 9.0369 0.19 Adventure,Drama,Mystery
tt3148266 4 12 Monkeys 2018-06-26 9.1363 0.38 Adventure,Drama,Mystery
tt1837492 1 13 Reasons Why 2017-03-31 8.437 2.38 Drama,Mystery
tt1837492 2 13 Reasons Why 2018-05-18 7.5089 2.19 Drama,Mystery
tt0285331 1 24 2002-02-16 8.5641 6.67 Action,Crime,Drama
tt0285331 2 24 2003-02-09 8.7028 7.13 Action,Crime,Drama
tt0285331 3 24 2004-02-09 8.7173 5.88 Action,Crime,Drama
خیلی بهتره، اینطور نیست؟
توجه داشته باشید: به جای تایپ کردن --csv --opprint
هر بار، ما می توانیم استفاده کنیم --c2p
گزینه ای که یک میانبر است.
زنجیر زدن
اینجاست که سرگرمی شروع می شود. به جای اجرای چند دستور، میتوانیم افعال را با استفاده از عبارت به هم زنجیر کنیم then
کلمه کلیدی.
ستون ها را حذف کنید
می توانید ببینید که یک وجود دارد titleId
ستونی که خیلی مفید نیست بیایید با استفاده از آن از شر آن خلاص شویم cut
فعل
mlr --c2p cut -x -f titleId then head ./tv_ratings.csv
خروجی زیر را به شما می دهد:
seasonNumber title date av_rating share genres
1 11.22.63 2016-03-10 8.489 0.51 Drama,Mystery,Sci-Fi
1 12 Monkeys 2015-02-27 8.3407 0.46 Adventure,Drama,Mystery
2 12 Monkeys 2016-05-30 8.8196 0.25 Adventure,Drama,Mystery
3 12 Monkeys 2017-05-19 9.0369 0.19 Adventure,Drama,Mystery
4 12 Monkeys 2018-06-26 9.1363 0.38 Adventure,Drama,Mystery
1 13 Reasons Why 2017-03-31 8.437 2.38 Drama,Mystery
2 13 Reasons Why 2018-05-18 7.5089 2.19 Drama,Mystery
1 24 2002-02-16 8.5641 6.67 Action,Crime,Drama
2 24 2003-02-09 8.7028 7.13 Action,Crime,Drama
3 24 2004-02-09 8.7173 5.88 Action,Crime,Drama
حقیقت خنده دار
این همان چیزی بود که من برای اولین بار در مورد میلر یاد گرفتم! من با یک مجموعه داده CSV بازی می کردم https://details.town/ که یک ستون بی فایده داشت، و من به دنبال “چگونه یک ستون را از خط فرمان CSV حذف کنیم” را جستجو کردم. من میلر را کشف کردم، آن را دوست داشتم و سپس مقاله ای را در مجله Smashing قرار دادم. حالا ما اینجا هستیم!
فیلتر کنید
این همان فعل است که برای اولین بار قبلاً نشان دادم. ما میتوانیم تمام ردیفهایی را که با یک عبارت خاص مطابقت ندارند حذف کنیم و به ما اجازه میدهیم دادههایمان را تنها با چند کاراکتر پاک کنیم.
اگر ما فقط رتبه بندی فصل های اول هر سریال را در مجموعه داده می خواهیم، این کار را به این صورت انجام می دهید:
mlr --c2p filter '$seasonNumber == 1' then head ./tv_ratings.csv
مرتب سازی
ما میتوانیم دادههایمان را بر اساس یک ستون خاص مانند آن در یک رابط کاربری مانند Excel یا MacOS Numbers مرتب کنیم. در اینجا نحوه مرتب سازی داده های خود بر اساس سری هایی با بالاترین رتبه آورده شده است:
mlr --c2p sort -nr av_rating then head ./tv_ratings.csv
خروجی حاصل به صورت زیر خواهد بود:
titleId seasonNumber title date av_rating share genres
tt0098887 1 Parenthood 1990-11-13 9.6824 1.68 Comedy,Drama
tt0106028 6 Homicide: Life on the Street 1997-12-05 9.6 0.13 Crime,Drama,Mystery
tt0108968 5 Touched by an Angel 1998-11-15 9.6 0.08 Drama,Family,Fantasy
tt0903747 5 Breaking Bad 2013-02-20 9.554 18.95 Crime,Drama,Thriller
tt0944947 6 Game of Thrones 2016-05-25 9.4943 15.18 Action,Adventure,Drama
tt3398228 5 BoJack Horseman 2018-09-14 9.4738 0.45 Animation,Comedy,Drama
tt0103352 3 Are You Afraid of the Dark? 1994-02-23 9.4349 2.6 Drama,Family,Fantasy
tt0944947 4 Game of Thrones 2014-05-09 9.4282 11.07 Action,Adventure,Drama
tt0976014 4 Greek 2011-03-07 9.4 0.01 Comedy,Drama
tt0090466 4 L.A. Law 1990-04-05 9.4 0.1 Drama
ما می توانیم آن را ببینیم پدر و مادر شدن، از سال 1990، بالاترین امتیاز را در IMDb دارد – چه کسی می دانست!
صرفه جویی در عملیات ما
به طور پیش فرض، Miller فقط داده های پردازش شده شما را در کنسول چاپ می کند. اگر بخواهیم آن را در فایل CSV دیگری ذخیره کنیم، می توانیم از آن استفاده کنیم >
اپراتور.
اگر بخواهیم داده های مرتب شده خود را در یک فایل CSV جدید ذخیره کنیم، دستور به این صورت خواهد بود:
mlr --csv sort -nr av_rating ./tv_ratings.csv > sorted.csv
CSV را به JSON تبدیل کنید
بیشتر اوقات، شما مستقیماً از داده های CSV در برنامه خود استفاده نمی کنید. شما آن را به قالبی تبدیل میکنید که خواندن آن آسانتر است یا به وابستگیهای اضافی نیاز ندارد، مانند JSON.
میلر به شما می دهد --c2j
گزینه ای برای تبدیل داده های خود از CSV به JSON. در اینجا نحوه انجام این کار برای داده های مرتب شده ما آمده است:
mlr --c2j sort -nr av_rating ./tv_ratings.csv > sorted.json
مطالعه موردی: 5 ورزشکار برتر با بیشترین تعداد مدال در ریو 2016
بیایید همه چیزهایی را که در بالا یاد گرفتیم در یک مورد استفاده در دنیای واقعی اعمال کنیم. بیایید بگوییم که شما مجموعه داده دقیقی از هر ورزشکاری دارید که در بازی های المپیک 2016 ریو شرکت کرده است و می خواهید بدانید که 5 نفری که بیشترین مدال را دارند چه کسانی هستند.
اولین، داده های ورزشکار را به صورت CSV دانلود کنید، سپس آن را در فایلی به نام ذخیره کنید athletes.csv
.
بیایید فایل زیر را باز کنیم:
mlr --c2p head ./athletes.csv
خروجی حاصل چیزی شبیه به زیر خواهد بود:
id name nationality sex date_of_birth height weight sport gold silver bronze info
736041664 A Jesus Garcia ESP male 1969-10-17 1.72 64 athletics 0 0 0 -
532037425 A Lam Shin KOR female 1986-09-23 1.68 56 fencing 0 0 0 -
435962603 Aaron Brown CAN male 1992-05-27 1.98 79 athletics 0 0 1 -
521041435 Aaron Cook MDA male 1991-01-02 1.83 80 taekwondo 0 0 0 -
33922579 Aaron Gate NZL male 1990-11-26 1.81 71 cycling 0 0 0 -
173071782 Aaron Royle AUS male 1990-01-26 1.80 67 triathlon 0 0 0 -
266237702 Aaron Russell USA male 1993-06-04 2.05 98 volleyball 0 0 1 -
382571888 Aaron Younger AUS male 1991-09-25 1.93 100 aquatics 0 0 0 -
87689776 Aauri Lorena Bokesa ESP female 1988-12-14 1.80 62 athletics 0 0 0 -
اختیاری: پاک کردن فایل
فایل CSV دارای چند فیلد است که به آنها نیاز نداریم. بیایید با حذف آن آن را تمیز کنیم info
، id
، weight
، و date_of_birth
ستون ها.
mlr --csv -I cut -x -f id,info,weight,date_of_birth athletes.csv
اکنون میتوانیم به مشکل اصلی خود برویم: میخواهیم بیابیم چه کسی بیشترین مدال را کسب کرده است. ما چند تا داریم هر مدال (برنز، نقره و طلا) ورزشکاران برنده شدند، اما تعداد کل مدال های هر ورزشکار را نداشتند.
بیایید یک مقدار جدید به نام محاسبه کنیم medals
که مربوط به این عدد کل است (مفرغ، نقره و طلا با هم).
mlr --c2p put '$medals=$bronze+$silver+$gold' then head ./athletes.csv
خروجی زیر را به شما می دهد:
name nationality sex height sport gold silver bronze medals
A Jesus Garcia ESP male 1.72 athletics 0 0 0 0
A Lam Shin KOR female 1.68 fencing 0 0 0 0
Aaron Brown CAN male 1.98 athletics 0 0 1 1
Aaron Cook MDA male 1.83 taekwondo 0 0 0 0
Aaron Gate NZL male 1.81 cycling 0 0 0 0
Aaron Royle AUS male 1.80 triathlon 0 0 0 0
Aaron Russell USA male 2.05 volleyball 0 0 1 1
Aaron Younger AUS male 1.93 aquatics 0 0 0 0
Aauri Lorena Bokesa ESP female 1.80 athletics 0 0 0 0
Ababel Yeshaneh ETH female 1.65 athletics 0 0 0 0
با اضافه کردن a بر اساس بیشترین تعداد مدال مرتب کنید sort
.
mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head ./athletes.csv
به ترتیب، خروجی حاصل به صورت زیر خواهد بود:
name nationality sex height sport gold silver bronze medals
Michael Phelps USA male 1.94 aquatics 5 1 0 6
Katie Ledecky USA female 1.83 aquatics 4 1 0 5
Simone Biles USA female 1.45 gymnastics 4 0 1 5
Emma McKeon AUS female 1.80 aquatics 1 2 1 4
Katinka Hosszu HUN female 1.75 aquatics 3 1 0 4
Madeline Dirado USA female 1.76 aquatics 2 1 1 4
Nathan Adrian USA male 1.99 aquatics 2 0 2 4
Penny Oleksiak CAN female 1.86 aquatics 1 1 2 4
Simone Manuel USA female 1.78 aquatics 2 2 0 4
Alexandra Raisman USA female 1.58 gymnastics 1 2 0 3
با افزودن به 5 مورد برتر محدود کنید -n 5
به شما head
عمل.
mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes.csv
در نهایت با فایل زیر مواجه خواهید شد:
name nationality sex height sport gold silver bronze medals
Michael Phelps USA male 1.94 aquatics 5 1 0 6
Katie Ledecky USA female 1.83 aquatics 4 1 0 5
Simone Biles USA female 1.45 gymnastics 4 0 1 5
Emma McKeon AUS female 1.80 aquatics 1 2 1 4
Katinka Hosszu HUN female 1.75 aquatics 3 1 0 4
به عنوان آخرین مرحله، اجازه دهید این فایل را با استفاده از فایل JSON به یک فایل JSON تبدیل کنیم --c2j
گزینه.
این دستور نهایی ما است:
mlr --c2j put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes.csv > top5.json
با یک فرمان، دادههای جدید را محاسبه کرده، نتیجه را مرتب کرده، آنها را کوتاه کرده و به JSON تبدیل کردهایم.
[
{
"name": "Michael Phelps",
"nationality": "USA",
"sex": "male",
"height": 1.94,
"weight": 90,
"sport": "aquatics",
"gold": 5,
"silver": 1,
"bronze": 0,
"medals": 6
}
// Other entries omitted for brevity.
]
جایزه: اگر میخواهید 5 زن برتر را نشان دهید، میتوانید یک را اضافه کنید filter
.
mlr --c2p put '$medals=$bronze+$silver+$gold' then sort -nr medals then filter '$sex == "female"' then head -n 5 ./athletes.csv
به ترتیب، خروجی زیر را خواهید داشت:
name nationality sex height sport gold silver bronze medals
Katie Ledecky USA female 1.83 aquatics 4 1 0 5
Simone Biles USA female 1.45 gymnastics 4 0 1 5
Emma McKeon AUS female 1.80 aquatics 1 2 1 4
Katinka Hosszu HUN female 1.75 aquatics 3 1 0 4
Madeline Dirado USA female 1.76 aquatics 2 1 1 4
نتیجه
امیدوارم این مقاله به شما نشان داده باشد که چقدر همه کاره است میلر است و قدرت ابزارهای خط فرمان را به شما چشید. دفعه بعد که میبینید یک اسکریپت تصادفی دیگر مینویسید، میتوانید به راحتی اینترنت را برای بهترین CLI به کار بگیرید.
منابع
مطالعه بیشتر در مجله Smashing
(yk, il)