Regex į pagalbą dataview

 


Įvadas

Šis įrašas yra apie labai specifinį Bash skriptą, kurį sukūriau savo asmeniniams poreikiams. Nors jis gali būti naudingas nedaugeliui, man pačiam jis yra itin vertingas ir palengvino tam tikrų duomenų apdorojimą. Skriptas yra skirtas apdoroti tekstinius failus, kuriuose pateikiama informacija apie komunalinius mokesčius, ir sukurti markdown (.md) failus su tinkamai formatuota informacija ‘dataview’ įskiepiui Obsidian programoje.

Problemos aprašymas

Turėjau tekstinius failus su informacija apie įvairius komunalinius mokesčius, kuriuos norėjau apdoroti ir perkelti į markdown formatą. Tekstiniai failai turėjo pavadinimus ir sumas, tačiau aš norėjau juos transformuoti į kitokį formatą bei pridėti keletą papildomų žymų (tags). Taip pat reikėjo pakeisti kai kuriuos pavadinimus į sutrumpintas versijas.

Sprendimas

Bash skriptas, kurį sukūriau, atlieka šiuos veiksmus:

  1. Skaito įvesties failus iš nurodyto katalogo.
  2. Naudoja reguliariąją išraišką (regex) išgauti reikiamą informaciją.
  3. Pakeičia tam tikrus pavadinimus pagal iš anksto nustatytą žemėlapį.
  4. Sukuria išvesties markdown failą su tinkamu formatu.

Skriptas

Štai kaip atrodo skriptas:


#!/bin/bash
 
# File name: mokesciai
# Author vaidotak
# Date: 2024-06-13
# Description:
# URL:
 
# Reguliarioji išraiška
regex='^([^(]+)\(.*\)\s+([0-9]+\.[0-9]+)\s*€'
 
# Įėjimo ir išėjimo katalogai
input_dir="$HOME/git/mokesciai"
output_dir="$HOME/Obsidian/notes"
 
# Pavadinimų pakeitimų žemėlapis
declare -A replacements=(
    ["Klaipėdos vanduo, AB"]="Klp_vanduo"
    ["Klaipėdos energija, AB"]="Klp_energija"
    ["„Telia“ paslaugos"]="Telia"
    ["TELE2, UAB"]="Tele2"
    ["Adminta, UAB"]="Adminta"
    ["Ignitis, UAB"]="Ignitis"
)
 
# Ciklas per visus failus, kurie prasideda "mokesciai"
for file in "$input_dir"/mokesciai*.txt; do
    # Gauname failo pavadinimą be galūnės
    filename=$(basename "$file" .txt)
 
    # Išėjimo failo pavadinimas
    output_file="$output_dir/$filename.md"
 
    # Pradedame rašyti į išėjimo failą
    {
        echo "---"
        while IFS= read -r line; do
            if [[ "$line" =~ $regex ]]; then
                original_name=$(echo "${BASH_REMATCH[1]}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
                amount="${BASH_REMATCH[2]}"
                replaced_name="${replacements[$original_name]}"
                if [ -n "$replaced_name" ]; then
                    echo "$replaced_name: $amount"
                else
                    echo "$original_name: $amount"
                fi
            fi
        done < "$file"
        echo "tags:"
        echo "  - mokesčiai"
        echo "  - komunaliniai"
        echo "  - mokesciai_uz_buta_ir_paslaugas"
        echo "date:"
        echo "---"
    } > "$output_file"
done

Kaip tai veikia

  1. Reguliarioji išraiška (regex):
	
regex='^([^(]+)\(.*\)\s+([0-9]+\.[0-9]+)\s*€'
  1. Ši reguliarioji išraiška naudojama išgauti pavadinimą ir sumą iš kiekvienos eilutės. Pirmoji grupė ([^(]+) ištraukia pavadinimą iki pirmo skliausto. Antroji grupė ([0-9]+\.[0-9]+) ištraukia sumą.
  2. Pavadinimų pakeitimas: Naudojamas asociatyvusis masyvas (declare -A replacements) laikyti originalius pavadinimus ir jų pakeitimus. Jei eilutės pavadinimas atitinka žemėlapio raktą, jis pakeičiamas į naują pavadinimą.
  3. Išėjimo failo formatavimas: Skriptas sukuria markdown failą su reikiamu formatu, įskaitant pavadinimų pakeitimus ir papildomas žymes (tags).

Pasiūlymai ir patarimai

  • Patikrinkite originalius pavadinimus: Kad pavadinimai būtų tiksliai pakeisti, įsitikinkite, kad originalūs pavadinimai tekstiniuose failuose atitinka raktus žemėlapyje be nereikalingų tarpų ar simbolių.
  • Naudokite sed tarpų pašalinimui: Jei kyla problemų su pavadinimų atitikimu, naudokite sed, kad pašalintumėte nereikalingus tarpus aplink pavadinimus.
  • Testuokite su mažais failais: Prieš apdorojant didelius failų rinkinius, išbandykite skriptą su keliais mažais failais, kad įsitikintumėte, jog viskas veikia taip, kaip tikėtasi.

Išvada

Nors šis skriptas yra labai specifinis, jis puikiai atitinka mano poreikius ir padeda lengvai apdoroti bei formatuoti komunalinių mokesčių duomenis. Jei turite panašių poreikių, tikiuosi, kad šis įrašas ir skriptas bus jums naudingas.

Komentarai

Populiarūs šio tinklaraščio įrašai

Configuring a NixOS firewall for everyday use

Setting up syncthing as a service on openSUSE and other Linux distributions

Monitoring SFTP server updates with Python