Tips en Trucs 2022

CSV viewers

Er zijn nogal wat programma's waarmee wij terminal-gebruikers een CSV-bestand kunnen bekijken als een eenvoudige tabel. Ik betwijfel of er CSV parsers zijn die perfect werken met alle variaties in het wild van het afschuwelijke, vreselijke CSV formaat, maar de twee hier getoonde parsers zijn meestal betrouwbaar.

Als voorbeeld gebruik ik de Lotto resultaten die je kunt downloaden van de website of met de opdracht

dany@pindabook:~> wget https://www.nationale-loterij.be/content/dam/opp/draw-games/lotto/brand-assets/documents/lotto-gamedata-19780204-20221022.csv
--2022-11-06 13:38:51--  https://www.nationale-loterij.be/content/dam/opp/draw-games/lotto/brand-assets/documents/lotto-gamedata-19780204-20221022.csv
Herleiden van www.nationale-loterij.be (www.nationale-loterij.be)... 2620:1ec:bdf::67, 2620:1ec:46::67, 13.107.213.67, ...
Verbinding maken met www.nationale-loterij.be (www.nationale-loterij.be)|2620:1ec:bdf::67|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 236964 (231K) [text/csv]
Wordt opgeslagen als: ‘lotto-gamedata-19780204-20221022.csv’

lotto-gamedata-19780204-20221022. 100%[============================================================>] 231,41K  --.-KB/s    in 0,06s   

2022-11-06 13:38:51 (3,73 MB/s) - '‘lotto-gamedata-19780204-20221022.csv’' opgeslagen [236964/236964]

Je kunt de structuur van een CSV bestand bekijken door de eerste regels weer te geven:

dany@pindabook:~> head lotto-gamedata-19780204-20221022.csv 
Date,Number 1,Number 2,Number 3,Number 4,Number 5,Number 6,Bonus
"2022-10-22,""02"",""06"",""17"",""18"",""27"",""33"",""12"""
"2022-10-19,""04"",""10"",""12"",""20"",""22"",""33"",""40"""
"2022-10-15,""01"",""12"",""21"",""23"",""32"",""45"",""15"""
"2022-10-12,""07"",""13"",""14"",""16"",""32"",""44"",""23"""
"2022-10-08,""08"",""13"",""14"",""23"",""26"",""33"",""25"""
"2022-10-05,""01"",""02"",""03"",""09"",""19"",""45"",""31"""
"2022-10-01,""02"",""06"",""08"",""20"",""22"",""38"",""27"""
"2022-09-28,""07"",""11"",""27"",""31"",""33"",""45"",""25"""
"2022-09-24,""03"",""19"",""22"",""29"",""39"",""40"",""21"""

Je merkt dat de kolomtitels gescheiden zijn door komma's. De gegevens zelf lijken mij een vreemde logica te bevatten. Er worden aanhalingstekens gebruikt om de tekstvelden af te bakenen, komma's om de velden te scheiden en per regel zien we aanhalingstekens die geen betekenis hebben.

CSVlook

Tijd om onze eerste CSV viewer (csvlook) erop los te laten. Csvlook maak deel uit van een pakket Python hulpmiddelen die je als volgt installeert:

dany@pindabook:~> sudo pip install csvkit
[sudo] wachtwoord voor root:
Collecting csvkit
  Downloading csvkit-1.0.7-py2.py3-none-any.whl (42 kB)
     |████████████████████████████████| 42 kB 365 kB/s 
Requirement already satisfied: six>=1.6.1 in /usr/lib/python3.6/site-packages (from csvkit) (1.14.0)
Collecting agate>=1.6.1
  Downloading agate-1.6.3-py2.py3-none-any.whl (100 kB)
     |████████████████████████████████| 100 kB 1.9 MB/s 
Collecting agate-excel>=0.2.2
  Downloading agate_excel-0.2.5-py2.py3-none-any.whl (7.1 kB)
...
Collecting zipp>=0.5
  Downloading zipp-3.6.0-py3-none-any.whl (5.3 kB)
Collecting typing-extensions>=3.6.4; python_version < "3.8"
  Downloading typing_extensions-4.1.1-py3-none-any.whl (26 kB)
Installing collected packages: isodate, pytz, Babel, pytimeparse, text-unidecode, python-slugify, leather, future, parsedatetime, agate, olefile, xlrd, et-xmlfile, openpyxl, agate-excel, dbfread, agate-dbf, greenlet, zipp, typing-extensions, importlib-metadata, sqlalchemy, agate-sql, csvkit
    Running setup.py install for future ... done
    Running setup.py install for parsedatetime ... done
    Running setup.py install for olefile ... done
Successfully installed Babel-2.11.0 agate-1.6.3 agate-dbf-0.2.2 agate-excel-0.2.5 agate-sql-0.5.8 csvkit-1.0.7 dbfread-2.0.7 et-xmlfile-1.1.0 future-0.18.2 greenlet-2.0.0.post0 importlib-metadata-4.8.3 isodate-0.6.1 leather-0.3.4 olefile-0.46 openpyxl-3.0.10 parsedatetime-2.4 python-slugify-6.1.2 pytimeparse-1.1.8 pytz-2022.6 sqlalchemy-1.4.43 text-unidecode-1.3 typing-extensions-4.1.1 xlrd-2.0.1 zipp-3.6.0

Met de volgende opdracht geef je met csvlook een CSV bestand in een tabel weer:

dany@pindabook:~> csvlook lotto-gamedata-19780204-20221022.csv | head
| Date                                          | Number 1 | Number 2 | Number 3 | Number 4 | Number 5 | Number 6 | Bonus |
| --------------------------------------------- | -------- | -------- | -------- | -------- | -------- | -------- | ----- |
| 2022-10-22,"02","06","17","18","27","33","12" |          |          |          |          |          |          |       |
| 2022-10-19,"04","10","12","20","22","33","40" |          |          |          |          |          |          |       |
| 2022-10-15,"01","12","21","23","32","45","15" |          |          |          |          |          |          |       |
| 2022-10-12,"07","13","14","16","32","44","23" |          |          |          |          |          |          |       |
| 2022-10-08,"08","13","14","23","26","33","25" |          |          |          |          |          |          |       |
| 2022-10-05,"01","02","03","09","19","45","31" |          |          |          |          |          |          |       |
| 2022-10-01,"02","06","08","20","22","38","27" |          |          |          |          |          |          |       |
| 2022-09-28,"07","11","27","31","33","45","25" |          |          |          |          |          |          |       |

De foutief gebruikte aanhalingstekens spelen ons hier duidelijk parten. De hier aangebrachte gegevens, bevatten geen velden waarin speciale teksns zoals komma's en aanhalingstekens staan waardoor de gebruikte aanhalingstekens overbodig zijn. Deze kunnen we wegfilteren met een sed filter:

dany@pindabook:~> head lotto-gamedata-19780204-20221022.csv | sed 's/\"//g'
Date,Number 1,Number 2,Number 3,Number 4,Number 5,Number 6,Bonus
2022-10-22,02,06,17,18,27,33,12
2022-10-19,04,10,12,20,22,33,40
2022-10-15,01,12,21,23,32,45,15
2022-10-12,07,13,14,16,32,44,23
2022-10-08,08,13,14,23,26,33,25
2022-10-05,01,02,03,09,19,45,31
2022-10-01,02,06,08,20,22,38,27
2022-09-28,07,11,27,31,33,45,25
2022-09-24,03,19,22,29,39,40,21

Sturen we de met sed gefilterde gegevens door naar cvslook, krijg je volgende resultaat:

dany@pindabook:~> head lotto-gamedata-19780204-20221022.csv | sed 's/\"//g' | csvlook 
|       Date | Number 1 | Number 2 | Number 3 | Number 4 | Number 5 | Number 6 | Bonus |
| ---------- | -------- | -------- | -------- | -------- | -------- | -------- | ----- |
| 2022-10-22 |        2 |        6 |       17 |       18 |       27 |       33 |    12 |
| 2022-10-19 |        4 |       10 |       12 |       20 |       22 |       33 |    40 |
| 2022-10-15 |        1 |       12 |       21 |       23 |       32 |       45 |    15 |
| 2022-10-12 |        7 |       13 |       14 |       16 |       32 |       44 |    23 |
| 2022-10-08 |        8 |       13 |       14 |       23 |       26 |       33 |    25 |
| 2022-10-05 |        1 |        2 |        3 |        9 |       19 |       45 |    31 |
| 2022-10-01 |        2 |        6 |        8 |       20 |       22 |       38 |    27 |
| 2022-09-28 |        7 |       11 |       27 |       31 |       33 |       45 |    25 |
| 2022-09-24 |        3 |       19 |       22 |       29 |       39 |       40 |    21 |

CSView

De meest recente versie van de tweede CSV viewer (csview), kan je rechtstreeks van de GitHub webpagina van de ontwikkelaar downloaden:

dany@pindabook:~> curl -s https://api.github.com/repos/wfxr/csview/releases/latest | grep "browser_download_url.*x86_64-unknown-linux-gnu.tar.gz" | cut -d : -f 2,3 | tr -d \" | wget -qi -

Enkel nog uitpakken:

dany@pindabook:~> tar -xvf csview-v1.2.2-x86_64-unknown-linux-gnu.tar.gz 
csview-v1.2.2-x86_64-unknown-linux-gnu/LICENSE-APACHE
csview-v1.2.2-x86_64-unknown-linux-gnu/LICENSE-MIT
csview-v1.2.2-x86_64-unknown-linux-gnu/README.md
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/elvish/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/elvish/csview.elv
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/powershell/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/powershell/_csview.ps1
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/zsh/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/zsh/_csview
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/bash/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/bash/csview.bash
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/fish/
csview-v1.2.2-x86_64-unknown-linux-gnu/completions/fish/csview.fish
csview-v1.2.2-x86_64-unknown-linux-gnu/csview

En gebruiken:

dany@pindabook:~> csview-v1.2.2-x86_64-unknown-linux-gnu/csview lotto-gamedata-19780204-20221022.csv 
csview: CSV error: record 1 (line: 1, byte: 65): found record with 1 fields, but the previous record has 8 fields

Ook CSView verslikt zich in de foutief gebruikte aanhalingstekens. We passen dezelfde sed filter toe en krijgen:

dany@pindabook:~> head lotto-gamedata-19780204-20221022.csv | sed 's/\"//g' | csview-v1.2.2-x86_64-unknown-linux-gnu/csview
┌────────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬───────┐
│    Date    │ Number 1 │ Number 2 │ Number 3 │ Number 4 │ Number 5 │ Number 6 │ Bonus │
├────────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼───────┤
│ 2022-10-22 │ 02       │ 06       │ 17       │ 18       │ 27       │ 33       │ 12    │
│ 2022-10-19 │ 04       │ 10       │ 12       │ 20       │ 22       │ 33       │ 40    │
│ 2022-10-15 │ 01       │ 12       │ 21       │ 23       │ 32       │ 45       │ 15    │
│ 2022-10-12 │ 07       │ 13       │ 14       │ 16       │ 32       │ 44       │ 23    │
│ 2022-10-08 │ 08       │ 13       │ 14       │ 23       │ 26       │ 33       │ 25    │
│ 2022-10-05 │ 01       │ 02       │ 03       │ 09       │ 19       │ 45       │ 31    │
│ 2022-10-01 │ 02       │ 06       │ 08       │ 20       │ 22       │ 38       │ 27    │
│ 2022-09-28 │ 07       │ 11       │ 27       │ 31       │ 33       │ 45       │ 25    │
│ 2022-09-24 │ 03       │ 19       │ 22       │ 29       │ 39       │ 40       │ 21    │
└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴───────┘

Tad

Als je het niet erg vindt om de terminal even te verlaten om een CSV te bekijken, kan je tad gebruiken. Opnieuw halen we het programma van de GitHub pagina van de ontwikkelaar, het downloaden duurt even, wees geduldig:

dany@pindabook:~> curl -s https://api.github.com/repos/antonycourtney/tad/releases/latest | grep "browser_download_url.*tar.bz2" | cut -d : -f 2,3 | tr -d \" | wget -qi -

En uitpakken:

dany@pindabook:~> tar -xvf tad-0.10.1.tar.bz2 
tad-0.10.1/
tad-0.10.1/LICENSE.electron.txt
tad-0.10.1/LICENSES.chromium.html
...
tad-0.10.1/tad
...
tad-0.10.1/resources/app.asar.unpacked/node_modules/ac-node-duckdb/src/tests/synthetic-test-data-generator/index.ts
tad-0.10.1/resources/app.asar.unpacked/node_modules/ac-node-duckdb/src/tests/test-fixtures/web_page.csv
tad-0.10.1/resources/app.asar.unpacked/node_modules/sqlite3/lib/binding/napi-v6-linux-glibc-x64/node_sqlite3.node

Het grafische tad programma kan starten vanaf de terminal met tad [bestandsnaam]. Net als csvlook herkent het automatisch veldscheidingstekens anders dan komma's.

dany@pindabook:~> tad-0.10.1/tad
18:56:26.478 › firstInstance. argv:  [ '/home/dany/tad-0.10.1/tad' ]
18:56:26.485 › *** options.srcfile:  null
*** registering handler for open-file event
18:56:26.486 › postInstallCheck: looking for install marker file  /home/dany/.config/tad/install-marker-0_10_1.txt
18:56:26.486 › postInstalCheck: found marker file, skipping post-install setup
failed to open /usr/lib64/dri/hybrid_drv_video.so
Not using hybrid_drv_video.so
[3713:1106/185626.621997:ERROR:sandbox_linux.cc(377)] InitializeSandbox() called with multiple threads in process gpu-process.
18:56:27.396 › initMainAsync:  {}
tad

Zoals je merkt heeft Tad minder last van de foutief gebruikte aanhalingstekens. Tad heeft een erg handige functie: klik op het pictogram links van het hoofdscherm en je kunt de individuele CSV-velden die je wilt bekijken selecteren/deselecteren. Onderaan het scherm kan je een paneel uitvouwen om de gegevens te filteren.

Opruimen

Bij het installeren van een Python pakket wordt op het einde een regel weergegeven met alle geïnstalleerde paketten:

Installing collected packages: isodate, pytz, Babel, pytimeparse, text-unidecode, python-slugify, leather, future, parsedatetime, agate, olefile, xlrd, et-xmlfile, openpyxl, agate-excel, dbfread, agate-dbf, greenlet, zipp, typing-extensions, importlib-metadata, sqlalchemy, agate-sql, csvkit

Deze informatie heb je nodig om een Python pakket met al zijn afhankelijke pakketten te verwijderen. De opdracht om het csvkit Python pakket te verwijderen, wordt zo:

dany@pindabook:~> sudo pip uninstall isodate pytz Babel pytimeparse text-unidecode python-slugify leather future parsedatetime agate olefile xlrd et-xmlfile openpyxl agate-excel dbfread agate-dbf greenlet zipp typing-extensions importlib-metadata sqlalchemy agate-sql csvkit -y
[sudo] wachtwoord voor root:
Found existing installation: isodate 0.6.1
Uninstalling isodate-0.6.1:
  Successfully uninstalled isodate-0.6.1
Found existing installation: pytz 2022.6
Uninstalling pytz-2022.6:
  Successfully uninstalled pytz-2022.6
...
Uninstalling agate-sql-0.5.8:
  Successfully uninstalled agate-sql-0.5.8
Found existing installation: csvkit 1.0.7
Uninstalling csvkit-1.0.7:
  Successfully uninstalled csvkit-1.0.7

CSView is een stuk eenvoudiger te verwijderen. Je verwijdert gewoon het gedownloade archief en de uitgepakte map:

dany@pindabook:~> rm -r csview-v1.2.2-x86_64-unknown-linux-gnu csview-v1.2.2-x86_64-unknown-linux-gnu.tar.gz

Tad verwijder je op dezelfde manier:

dany@pindabook:~> rm -r tad-0.10.1 tad-0.10.1.tar.bz2

Tad gebruikt een configuratiemap die je verwijdert met:

dany@pindabook:~> rm -r .config/tad/

Het voorbeeld CSV bestand verwijder je met:

dany@pindabook:~> rm lotto-gamedata-19780204-20221022.csv