Si të analizoni të dhënat CSV në Bash


Skedarët e vlerave të ndara me presje (CSV) janë një nga formatet më të zakonshme për të dhënat e eksportuara. Në Linux, ne mund të lexojmë skedarë CSV duke përdorur komandat Bash. Por mund të ndërlikohet shumë, shumë shpejt. Ne do të japim një dorë.

Çfarë është një skedar CSV?

Një skedar me vlera të ndara me presje është një skedar teksti që mban të dhëna të tabeluara. CSV është një lloj i të dhënave të kufizuara. Siç sugjeron emri, një presje , përdoret për të ndarë secilën fushë të të dhënave - ose vlera - nga fqinjët e saj.

CSV është kudo. Nëse një aplikacion ka funksione importi dhe eksporti, ai pothuajse gjithmonë do të mbështesë CSV. Skedarët CSV janë të lexueshëm nga njeriu. Mund t'i shikoni brenda tyre me më pak, t'i hapni në çdo redaktues teksti dhe t'i zhvendosni nga programi në program. Për shembull, mund t'i eksportoni të dhënat nga një bazë të dhënash SQLite dhe t'i hapni ato në LibreOffice Calc.

Megjithatë, edhe CSV mund të bëhet i ndërlikuar. Dëshironi të keni një presje në një fushë të dhënash? Ajo fushë duhet të ketë thonjëza \ të mbështjellë rreth saj. Për të përfshirë thonjëza në një fushë, çdo thonjë duhet të futet dy herë.

Sigurisht, nëse jeni duke punuar me CSV të krijuar nga një program ose skenar që keni shkruar, formati CSV ka të ngjarë të jetë i thjeshtë dhe i drejtpërdrejtë. Nëse jeni të detyruar të punoni me formate më komplekse CSV, me Linux që është Linux, ka zgjidhje që mund t'i përdorim edhe për këtë.

Disa mostra të të dhënave

Mund të gjenerosh lehtësisht disa mostra të të dhënave CSV, duke përdorur sajte si Generatori i të dhënave në linjë. Ju mund të përcaktoni fushat që dëshironi dhe të zgjidhni sa rreshta të dhënash dëshironi. Të dhënat tuaja krijohen duke përdorur vlera realiste të rreme dhe shkarkohen në kompjuterin tuaj.

Ne krijuam një skedar që përmban 50 rreshta të informacionit të rremë të punonjësve:

  • id: Një vlerë e thjeshtë unike me numër të plotë.
  • emri: Emri i parë i personit.
  • mbiemri: Mbiemri i personit.
  • titulli i punës: titulli i punës së personit.
  • adresa e emailit: Adresa e emailit të personit.
  • dega: Dega e kompanisë ku ata punojnë.
  • gjendja: Gjendja në të cilën ndodhet dega.

Disa skedarë CSV kanë një linjë koke që liston emrat e fushave. Skedari ynë i mostrës ka një të tillë. Këtu është pjesa e sipërme e skedarit tonë:

Rreshti i parë mban emrat e fushave si vlera të ndara me presje.

Analiza e të dhënave Formoni skedarin CSV

Le të shkruajmë një skript që do të lexojë skedarin CSV dhe do të nxjerrë fushat nga çdo rekord. Kopjojeni këtë skript në një redaktues dhe ruajeni në një skedar të quajtur field.sh.

#! /bin/bash

while IFS="," read -r id firstname lastname jobtitle email branch state
do
  echo "Record ID: $id"
  echo "Firstname: $firstname"
  echo " Lastname: $lastname"
  echo "Job Title: $jobtitle"
  echo "Email add: $email"
  echo " Branch: $branch"
  echo " State: $state"
  echo ""
done < <(tail -n +2 sample.csv)

Është pak e mbushur me skenarin tonë të vogël. Le ta zbërthejmë.

Ne po përdorim një lak while. Për sa kohë që cikli while kushti  zgjidhet në true, trupi i ciklit while do të ekzekutohet. Trupi i lakut është mjaft i thjeshtë. Një koleksion deklaratash echo përdoren për të printuar vlerat e disa variablave në dritaren e terminalit.

Kushti i ciklit while është më interesant se trupi i ciklit. Ne përcaktojmë që një presje duhet të përdoret si ndarës i brendshëm i fushës, me deklaratën IFS=\,\. IFS është një variabël mjedisor. Komanda lexo i referohet vlerës së saj kur analizon sekuencat e tekstit.

Ne po përdorim opsionin -r të komandës lexo (retain backslashes) për të injoruar çdo vijë të prapme që mund të jetë në të dhëna. Ata do të trajtohen si personazhe të rregullt.

Teksti që analizon komanda lexo ruhet në një grup variablash të emërtuar sipas fushave CSV. Ata mund të quheshin po aq lehtë field1, field2, ... field7, por emrat kuptimplotë e bëjnë jetën më të lehtë.

Të dhënat merren si dalje nga komanda tail. Ne po përdorim tail sepse na jep një mënyrë të thjeshtë për të kapërcyer vijën e kokës së skedarit CSV. Opsioni -n +2 (numri i rreshtit) i thotë tail të fillojë të lexojë në rreshtin numër dy.

Konstrukti <(...) quhet zëvendësimi i procesit. Ai bën që Bash të pranojë daljen e një procesi sikur të vinte nga një përshkrues skedari. Kjo më pas ridrejtohet në ciklin while, duke ofruar tekstin që komanda lexo do të analizojë.

Bëni skriptin të ekzekutueshëm duke përdorur komandën chmod. Do t'ju duhet ta bëni këtë sa herë që kopjoni një skenar nga ky artikull. Zëvendësoni emrin e skenarit të duhur në secilin rast.

chmod +x field.sh

Kur ekzekutojmë skriptin, të dhënat ndahen saktë në fushat e tyre përbërëse, me secilën fushë të ruajtur në një variabël të ndryshëm.

./field.sh

Çdo rekord printohet si një grup fushash.

Përzgjedhja e fushave

Ndoshta nuk duam ose nuk kemi nevojë të marrim çdo fushë. Ne mund të marrim një përzgjedhje fushash duke inkorporuar komandën cut.

Ky skenar quhet select.sh.

#!/bin/bash

while IFS="," read -r id jobtitle branch state
do
  echo "Record ID: $id"
  echo "Job Title: $jobtitle"
  echo " Branch: $branch"
  echo " State: $state"
  echo ""
done < <(cut -d "," -f1,4,6,7 sample.csv | tail -n +2)

Ne kemi shtuar komandën cut në klauzolën e zëvendësimit të procesit. Ne po përdorim opsionin -d (kufizues) për t'i thënë cut të përdorë presjet , si ndarës. Opsioni -f (fushë) i thotë cut që duam fushat një, katër, gjashtë dhe shtatë. Këto katër fusha lexohen në katër variabla, të cilat shtypen në trupin e ciklit while.

Kjo është ajo që marrim kur ekzekutojmë skenarin.

./select.sh

Duke shtuar komandën cut, ne jemi në gjendje të zgjedhim fushat që duam dhe të shpërfillim ato që nuk i duam.

Deri tani, kaq mirë. Por…

Nëse CSV-ja me të cilën trajtoni është e pakomplikuar pa presje ose thonjëza në të dhënat e fushës, ajo që kemi mbuluar me siguri do të plotësojë nevojat tuaja për analizimin e CSV-së. Për të treguar problemet që mund të hasim, ne modifikuam një mostër të vogël të të dhënave për t'u dukur kështu.

id,firstname,lastname,job-title,email-address,branch,state
1,Rosalyn,Brennan,"Steward, Senior",Rosalyn_Brennan4351@mafthy.com,Minneapolis,Maryland
2,Danny,Redden,"Analyst ""Budget""",Danny_Redden1443@brety.org,Venice,North Carolina
3,Lexi,Roscoe,Pharmacist,,Irlington,Vermont

  • Regjistrimi ka një presje në fushën titulli i punës, kështu që fusha duhet të mbështillet me thonjëza.
  • Regjistri dy ka një fjalë të mbështjellë në dy grupe thonjëzash në fushën jobs-title.
  • Regjistrimi tre nuk ka të dhëna në fushën adresa e emailit.

Këto të dhëna u ruajtën si sample2.csv. Modifiko skriptin tënd field.sh për të thirrur sample2.csv dhe ruaje si field2.sh.

#! /bin/bash

while IFS="," read -r id firstname lastname jobtitle email branch state
do
  echo "Record ID: $id"
  echo "Firstname: $firstname"
  echo " Lastname: $lastname"
  echo "Job Title: $jobtitle"
  echo "Email add: $email"
  echo " Branch: $branch"
  echo " State: $state"
  echo ""
done < <(tail -n +2 sample2.csv)

Kur ekzekutojmë këtë skript, mund të shohim çarje që shfaqen në analizuesit tanë të thjeshtë CSV.

./field2.sh

Regjistrimi i parë ndan fushën e titullit të punës në dy fusha, duke e trajtuar pjesën e dytë si adresën e emailit. Çdo fushë pas kësaj zhvendoset një vend në të djathtë. Fusha e fundit përmban vlerat degë dhe state.

Regjistrimi i dytë ruan të gjitha thonjëzat. Duhet të ketë vetëm një palë thonjëza rreth fjalës Buxhet.

Regjistrimi i tretë në fakt trajton fushën që mungon siç duhet. Adresa e emailit mungon, por gjithçka tjetër është ashtu siç duhet.

Në mënyrë kundërintuitive, për një format të thjeshtë të dhënash, është shumë e vështirë të shkruhet një analizues i fuqishëm CSV i rastit të përgjithshëm. Mjetet si awk do t'ju lejojnë të afroheni, por ka gjithmonë raste të skajshme dhe përjashtime që kalojnë.

Përpjekja për të shkruar një analizues të pagabueshëm CSV ndoshta nuk është mënyra më e mirë përpara. Një qasje alternative - veçanërisht nëse jeni duke punuar në një lloj afati - përdor dy strategji të ndryshme.

Njëra është të përdorni një mjet të krijuar për qëllimin për të manipuluar dhe nxjerrë të dhënat tuaja. E dyta është të pastroni të dhënat tuaja dhe të zëvendësoni skenarët e problemit siç janë presjet e integruara dhe thonjëzat. Analistët tuaj të thjeshtë Bash më pas mund të përballojnë CSV-në e përshtatshme për Bash.

Paketa e veglave csvkit

Paketa e veglave CSV csvkit është një koleksion shërbimesh të krijuara shprehimisht për të ndihmuar punën me skedarët CSV. Do t'ju duhet ta instaloni në kompjuterin tuaj.

Për ta instaluar atë në Ubuntu, përdorni këtë komandë:

sudo apt install csvkit

Për ta instaluar atë në Fedora, duhet të shkruani:

sudo dnf install python3-csvkit

Në Manjaro komanda është:

sudo pacman -S csvkit

Nëse i kalojmë emrin e një skedari CSV, mjeti csvlook  shfaq një tabelë që tregon përmbajtjen e secilës fushë. Përmbajtja e fushës shfaqet për të treguar se çfarë përfaqëson përmbajtja e fushës, jo siç janë ruajtur në skedarin CSV.

Le të provojmë csvlook me skedarin tonë problematik sample2.csv.

csvlook sample2.csv

Të gjitha fushat janë shfaqur saktë. Kjo dëshmon se problemi nuk është CSV. Problemi është se skriptet tona janë shumë të thjeshta për të interpretuar saktë CSV-në.

Për të zgjedhur kolona specifike, përdorni komandën csvcut. Opsioni -c (kolona) mund të përdoret me emrat e fushave ose numrat e kolonave, ose një përzierje të të dyjave.

Supozoni se duhet të nxjerrim emrin dhe mbiemrin, titujt e punës dhe adresat e postës elektronike nga çdo regjistrim, por ne duam të kemi renditjen e emrit si mbiemri, emri. Gjithçka që duhet të bëjmë është t'i vendosim emrat e fushave ose numrat sipas renditjes që duam.

Këto tre komanda janë të gjitha ekuivalente.

csvcut -c lastname,firstname,job-title,email-address sample2.csv
csvcut -c lastname,firstname,4,5 sample2.csv
csvcut -c 3,2,4,5 sample2.csv

Mund të shtojmë komandën csvsort për të renditur daljen sipas një fushe. Ne përdorim opsionin -c (kolona) për të specifikuar kolonën sipas renditjes dhe opsionin -r (e kundërt) për të renditur në rend zbritës.

csvcut -c 3,2,4,5 sample2.csv | csvsort -c 1 -r

Për ta bërë daljen më të bukur, mund ta ushqejmë atë përmes csvlook .

csvcut -c 3,2,4,5 sample2.csv | csvsort -c 1 -r | csvlook

Një prekje e pastër është se, edhe pse të dhënat janë të renditura, linja e kokës me emrat e fushave mbahet si rreshti i parë. Pasi të jemi të lumtur që i kemi të dhënat ashtu siç duam, mund të heqim csvlook nga zinxhiri i komandës dhe të krijojmë një skedar të ri CSV duke e ridrejtuar daljen në një skedar.

Ne shtuam më shumë të dhëna në sample2.file, hoqëm komandën csvsort dhe krijuam një skedar të ri të quajtur sample3.csv.

csvcut -c 3,2,4,5 sample2.csv > sample3.csv

Një mënyrë e sigurt për të pastruar të dhënat CSV

Nëse hapni një skedar CSV në LibreOffice Calc, çdo fushë do të vendoset në një qelizë. Ju mund të përdorni funksionin e gjetjes dhe zëvendësimit për të kërkuar presje. Mund t'i zëvendësoni me asgjë në mënyrë që të zhduken, ose me një karakter që nuk do të ndikojë në analizimin e CSV, si për shembull një pikëpresje ;.

Ju nuk do të shihni thonjëza rreth fushave të cituara. Të vetmet thonjëza që do të shihni janë thonjëzat e integruara brenda të dhënat e fushës. Këto tregohen si thonjëza të vetme. Gjetja dhe zëvendësimi i tyre me një apostrof të vetëm do të zëvendësojë thonjëzat e dyfishta në skedarin CSV.

Të bësh gjetjen dhe zëvendësimin në një aplikacion si LibreOffice Calc do të thotë që nuk mund të fshish aksidentalisht asnjërën nga presjet ndarëse të fushave, as t'i fshish thonjëzat rreth fushave të cituara. Ju do të ndryshoni vetëm vlerat e të dhënave të fushave.

Ne ndryshuam të gjitha presjet në fushat me pikëpresje dhe të gjitha thonjëzat e ngulitura me apostrofa dhe i ruajtëm ndryshimet tona.

Më pas krijuam një skript të quajtur field3.sh për të analizuar sample3.csv.

#! /bin/bash

while IFS="," read -r lastname firstname jobtitle email
do
  echo " Lastname: $lastname"
  echo "Firstname: $firstname"
  echo "Job Title: $jobtitle"
  echo "Email add: $email"
  echo ""
done < <(tail -n +2 sample3.csv)

Le të shohim se çfarë marrim kur e drejtojmë atë.

./field3.sh

Analisti ynë i thjeshtë tani mund të trajtojë të dhënat tona problematike më parë.

Do të shihni shumë CSV

CSV është padyshim gjëja më e afërt me një gjuhë të zakonshme për të dhënat e aplikacionit. Shumica e aplikacioneve që trajtojnë një formë të të dhënave mbështesin importimin dhe eksportimin e CSV. Të dini se si të trajtoni CSV-në një mënyrë realiste dhe praktike-do t'ju qëndrojë në vend të mirë.