Tips en Trucs 2022

CSV bestanden raadplegen en manipuleren

Gegevens worden dikwijls uitgewisseld via CSV bestanden, maar hoe verwerk je die gegevens met behulp van een script of opdrachten. Zoals zo dikwijls in de Linux opdrachtenwereld gebruiken we daar de speciaal daarvoor geschreven opdracht XSV voor.

XSV installeren

De standaard openSUSE Leap 15.3 softwarebronnen bevatten het xsv pakket niet. De opslagruimte (repository) utilities met het xsv pakket, voeg je met de volgende opdracht aan het softwarebeheer toe:

dany@pindabook:~> sudo zypper addrepo -f https://download.opensuse.org/repositories/utilities/openSUSE_Leap_15.3/ "utilities"
Opslagruimte 'utilities' wordt toegevoegd ...................................................................................[gereed]
Opslagruimte 'utilities' is toegevoegd

URI                    : https://download.opensuse.org/repositories/utilities/openSUSE_Leap_15.3/
Ingeschakeld           : Ja
GPG-controle           : Ja
Automatisch vernieuwen : Ja
Prioriteit             : 99 (standaard prioriteit)

Prioriteiten van opslagruimtes hebben geen effect. Alle ingeschakelde opslagruimtes delen dezelfde prioriteit.

En kunnen we de XSV opdracht installeren, hierbij moet je wel de softwarebron vertrouwen door de sleutel te accepteren:

dany@pindabook:~> sudo zypper install xsv
Ophalen van metagegevens uit opslagruimte 'utilities' ----------------------------------------------------------------------------[\]

Een nieuwe handtekening voor een opslagruimte of pakket is ontvangen:

  Opslagruimte:              utilities
  Vingerafdruk van sleutel:  8B00 7963 8DF6 09E2 FD8B 8CCE 7CD9 4DEB 9056 621D
  Sleutelnaam:               utilities OBS Project 
  Sleutelalgoritme:          DSA 1024
  Sleutel aangemaakt:        vr 10 sep 2021 16:17:23 CEST
  Sleutel verloopt op:       zo 19 nov 2023 15:17:23 CET
  Rpm-naam:                  gpg-pubkey-9056621d-613b68f3



    Opmerking: Ondertekenen van gegevens maakt het mogelijk voor de ontvanger om te controleren dat
    er na het ondertekenen geen wijzigingen zijn geweest na het ondertekenen. Accepteren van
    pakketten met foute ondertekening kan leiden tot een corrupt systeem en in extreme gevallen
    zelfs tot een gecompromitteerd systeem.

    Opmerking: Een GPG publieke sleutel wordt betrouwbaar geïdentificeerd door zijn vingerafdruk.
    Vertrouw niet op de sleutelnaam. Als u niet zeker bent of de gepresenteerde sleutel is autentiek
    is, vraag dan de leverancier van de opslagruimte of controleer zijn website. Veel leveranciers
    onderhouden een webpagina die de vingerafdrukken tonen van de GPG sleutels die ze gebruiken.

Wilt u de sleutel verwerpen, tijdelijk vertrouwen of altijd vertrouwen? [v/t/a/?] (v): a
Ophalen van metagegevens uit opslagruimte 'utilities' .......................................................................[gereed]
Cache van opslagruimte 'utilities' wordt gebouwd ............................................................................[gereed]
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 2 NIEUWE pakketten zullen worden geïnstalleerd:
  xsv xsv-bash-completion

2 nieuwe te installeren pakketten.
Totale downloadgrootte: 650,9 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 2,3 MiB worden gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket xsv-0.13.0-lp153.4.1.x86_64 wordt opgehaald                                             (1/2), 643,4 KiB (  2,3 MiB uitgepakt)
Ophalen: xsv-0.13.0-lp153.4.1.x86_64.rpm ........................................................................[gereed (2,7 KiB/s)]
pakket xsv-bash-completion-0.13.0-lp153.4.1.noarch wordt opgehaald                             (2/2),   7,5 KiB (  1,2 KiB uitgepakt)
Ophalen: xsv-bash-completion-0.13.0-lp153.4.1.noarch.rpm ....................................................................[gereed]

Controleren op conflicten tussen bestanden: .................................................................................[gereed]
(1/2) Installeren van: xsv-0.13.0-lp153.4.1.x86_64 ..........................................................................[gereed]
(2/2) Installeren van: xsv-bash-completion-0.13.0-lp153.4.1.noarch ..........................................................[gereed]

Gegevens in CSV bestanden raadplegen

Als voorbeeld gebruik ik de trekkingsresultaten van de Lotto uitslagen. Maar zoals zoveel CSV bestanden, volgt ons gedownloade CSV bestand de standaard niet. Het gebruikt ; in plaats van , voor het scheiden van de gegevens. CSV staat namelijk voor Comma Separated Values. Om dit duidelijk te maken, voegen ze als eerste regel de aangepaste structuur toe. Dit maakt het nog moeilijker, want de eerste regel bevat namelijk de namen van de gebruikte gegevensvelden. Dit bewijzen de eerste vier regels van het CSV bestand:

dany@pindabook:~> cat Downloads/LottoGameData-20220102.csv | head -4
sep=;
Datum;Nummer 1;Nummer 2;Nummer 3;Nummer 4;Nummer 5;Nummer 6;Bonus
01-01-2022;13;19;26;30;32;40;27
29-12-2021;4;10;11;18;19;23;13

Met een tail -n +2 opdracht negeren we de eerste regel:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | head -4
Datum;Nummer 1;Nummer 2;Nummer 3;Nummer 4;Nummer 5;Nummer 6;Bonus
01-01-2022;13;19;26;30;32;40;27
29-12-2021;4;10;11;18;19;23;13
25-12-2021;4;9;10;18;26;45;20

Met de optie -d ';' geven we aan dat ons CSV bestand ; gebruikt om gegevensvelden te scheiden. Met de table optie geven we aan dat we de gegevens in een met tabs geformatteerde tabel willen weergeven:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | xsv table -d ';' | head -4
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
01-01-2022  13        19        26        30        32        40        27
29-12-2021  4         10        11        18        19        23        13
25-12-2021  4         9         10        18        26        45        20

Om een bepaalde rij met gegevens (record) weer te geven, gebruik je bijvoorbeeld de optie slice -i 1 om de tweede rij weer te geven. In de informatica beginnen we dikwijls te tellen van 0 voor het eerste element:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | xsv slice -i 1 -d ';' | xsv table
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
29-12-2021  4         10        11        18        19        23        13

Om de gegevens verticaal weer te geven, gebruik je de optie flatten:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | xsv slice -i 1 -d ';' | xsv flatten
Datum     29-12-2021
Nummer 1  4
Nummer 2  10
Nummer 3  11
Nummer 4  18
Nummer 5  19
Nummer 6  23
Bonus     13

Om het aantal rijen (records) te tellen gebruik je de count optie:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | xsv count -d ';'
3766

Ik wordt het zo stilaan beu om telkens de eerste regel te moeten negeren en rekening te houden met de ;. De tail opdracht zorgt dat we de eerste regel negeren, waarna de xsv opdracht dankzij de fmt optie de ; vervangt door een , en het resultaat opslaat in het bestand standaard.csv:

dany@pindabook:~> tail -n +2 Downloads/LottoGameData-20220102.csv | xsv fmt -d ';' > standaard.csv

Vlug even checken:

dany@pindabook:~> head -4 standaard.csv 
Datum,Nummer 1,Nummer 2,Nummer 3,Nummer 4,Nummer 5,Nummer 6,Bonus
01-01-2022,13,19,26,30,32,40,27
29-12-2021,4,10,11,18,19,23,13
25-12-2021,4,9,10,18,26,45,20

Xsv kan ook CSV bestanden samenvoegen zowel op basis van rijen als kolommen:

dany@pindabook:~> xsv cat rows standaard.csv standaard.csv | xsv count
7532

Of wil je enkele gegevensstatistieken opvragen:

dany@pindabook:~> xsv stats standaard.csv | xsv table
field     type     sum     min         max         min_length  max_length  mean                stddev
Datum     Unicode          01-01-1983  31-12-2016  10          10                              
Nummer 1  Integer  23777   1           33          1           2           6.313595326606487   4.996563979208236
Nummer 2  Integer  47367   2           37          1           2           12.577535847052573  6.4958187363007065
Nummer 3  Integer  70560   3           39          1           2           18.73605947955393   7.032087203019839
Nummer 4  Integer  93542   5           43          1           2           24.838555496548096  7.129405528669296
Nummer 5  Integer  117379  8           44          1           2           31.168082846521553  6.519886722780909
Nummer 6  Integer  141099  13          45          2           2           37.46654275092928   5.146119925587959
Bonus     Integer  80334   1           45          1           2           21.331386086032907  12.35486567439524

Zoeken is vooral in zeer grote CSV bestanden erg handig. De volgende opdracht toont alle rijen waarbij het Datum veld (kolom) de tekenreeks '12-2021' (december 2021) bevat:

dany@pindabook:~> xsv search -s Datum '12-2021' standaard.csv | xsv table
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
29-12-2021  4         10        11        18        19        23        13
25-12-2021  4         9         10        18        26        45        20
22-12-2021  8         19        22        25        26        36        18
18-12-2021  5         27        35        37        43        44        19
15-12-2021  1         24        27        31        34        44        32
11-12-2021  1         10        24        29        37        38        33
08-12-2021  13        18        33        38        40        44        1
04-12-2021  1         5         6         10        18        45        13
01-12-2021  11        13        18        24        40        42        8

Daarbij kan je gebruik maken van reguliere expressies, zoals in het voorbeeld zoeken naar Datums in november en december 2021:

dany@pindabook:~> xsv search -s Datum '1[1-2]-2021' standaard.csv | xsv count
17

Om een paar willekeurige records (rijen) weer te geven, gebruik je de sample optie:

dany@pindabook:~> xsv sample 2 standaard.csv | xsv table
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
26-07-1980  8         12        14        15        34        40        16
27-12-1995  12        22        27        31        34        38        33

Enkel bepaalde velden (kolommen) weergeven, gebeurt met de select optie:

dany@pindabook:~> xsv sample 2 standaard.csv | xsv select "Datum,Nummer 6" | xsv table
Datum       Nummer 6
12-07-2000  41
19-06-2004  36

De gegevens kan je weergeven, gesorteerd op een bepaald veld (hier Bonus):

dany@pindabook:~> xsv sort -s Bonus standaard.csv | xsv table | head -3
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
08-12-2021  13        18        33        38        40        44        1
24-03-2021  3         11        12        13        20        26        1

Dit is echter niet correct, want het veld Bonus bevat gehele getallen, met de sort optie --numeric wordt dit correct uitgevoerd. De sort optie --reverse zorgt dat we deze keer aflopend sorteren.

dany@pindabook:~> xsv sort --reverse --numeric -s Bonus standaard.csv | xsv table | head -3
Datum       Nummer 1  Nummer 2  Nummer 3  Nummer 4  Nummer 5  Nummer 6  Bonus
01-09-2021  2         8         14        17        30        33        45
26-12-2020  6         9         10        17        29        42        45

Bij zeer grote CSV bestanden heeft xsv meer tijd nodig om de opdrachten uit te voeren. Je kunt dit versnellen door xsv eerst een index bestand te laten aanmaken, waarmee dan daaropvolgende opdrachten sneller uitgevoerd worden.

dany@pindabook:~> xsv index standaard.csv
dany@pindabook:~> ls -l standaard.csv*
-rw-r--r-- 1 dany users 114995  3 jan 18:12 standaard.csv
-rw-r--r-- 1 dany users  30144  3 jan 18:32 standaard.csv.idx
xsv

Opruimen

Eerst verwijderen we de gebruikte voorbeeldbestanden:

dany@pindabook:~> rm standaard.csv standaard.csv.idx
dany@pindabook:~> rm Downloads/LottoGameData-20220102.csv

De xsv opdracht verwijder je met de opdracht:

dany@pindabook:~> sudo zypper remove -u xsv
[sudo] wachtwoord voor root: 
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 2 pakketten zullen worden VERWIJDERD:
  xsv xsv-bash-completion

2 te verwijderen pakketten.
Na de bewerking zal 2,3 MiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
(1/2) Verwijderen van xsv-bash-completion-0.13.0-lp153.4.1.noarch ...........................................................[gereed]
(2/2) Verwijderen van xsv-0.13.0-lp153.4.1.x86_64 ...........................................................................[gereed]

Om de toegevoegde softwarebron en bijhorende GPG-sleutel te verwijderen, moet je eerst de bij de softwarebron horende sleutel opsporen. Een lijst met GPG-sleutels die door het softwarebeheer gebruikt worden, vraag je op met de opdracht:

dany@pindabook:~> rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'
gpg-pubkey-307e3d54-5aaa90a5    gpg(SuSE Package Signing Key )
gpg-pubkey-39db7c82-5f68629b    gpg(SuSE Package Signing Key )
gpg-pubkey-3dbdc284-53674dd4    gpg(openSUSE Project Signing Key )
gpg-pubkey-1abd1afb-54176598    gpg(PackMan Project (signing key) )
gpg-pubkey-65176565-61a0ee8f    gpg(openSUSE:Backports OBS Project )
gpg-pubkey-9056621d-613b68f3    gpg(utilities OBS Project )

De GPG-sleutel voor de utilities softwarebron staat in het voorbeeld als laatste en heeft als referentie gpg-pubkey-9056621d-613b68f3. Deze referentie heb je nodig om de GPG-sleutel te verwijderen met:

dany@pindabook:~> sudo rpm -e gpg-pubkey-9056621d-613b68f3

Door het verwijderen van de GPG-sleutel vertrouw je de softwarebron niet langer. De softwarebron utilities zelf, verwijder je met de opdracht:

dany@pindabook:~> sudo zypper removerepo "utilities"
Opslagruimte 'utilities' wordt verwijderd ...................................................................................[gereed]
Opslagruimte 'utilities' is verwijderd.