به من اجازه دهید مقدمه این مقاله را با گفتن اینکه من یک فرد پایانی نیستم، مطرح کنم. من از 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

سرمقاله Smashing
(yk, il)