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:
- Skaito įvesties failus iš nurodyto katalogo.
- Naudoja reguliariąją išraišką (
regex
) išgauti reikiamą informaciją. - Pakeičia tam tikrus pavadinimus pagal iš anksto nustatytą žemėlapį.
- 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
- Reguliarioji išraiška (regex):
regex='^([^(]+)\(.*\)\s+([0-9]+\.[0-9]+)\s*€'
- Š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ą. - 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ą. - 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, naudokitesed
, 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
Rašyti komentarą