Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam
Jestem w trakcie pisania skryptu który będzie generować raport.
sytuacja wygląda tak że gotowy raport musi być w Excelu i skladać się z kolumn:
LP. czyli kolejna liczba całkowita
Numer wartoaci
Nazwa wartosci
Ilosc sztuk
Obecnie posiadam plik raportu pobrany z programu i zmodyfikowalem go do formatu
Nazwa wartości ; ilość sztuk (te dane pobieram z programu)
Mam plik wzorcowy w którym są wypisane kolumny:
LP., numer wartości, nazwa wartości oraz ilość domyślnie ustawiona na 0.
Może ktoś podpowiedzieć jak się za to zabrać żeby połączyć ze sobą te 2pliki?
Potrzebuję do pliku wzorcowego przypisać wartości z mojego raportu.
Częścią wspólną swoich plików jest nazwa wartości. Myślałem o pętli while + użyciu tablicy żeby dane z raportu potraktować jak kolejne elementy tablicy ale nie bardzo wiem jak zacząć pisanie czegoś takiego.
Ważne jest to, że w wygenerowany raporcie mam tylko wartości niezerowe, a w raporcie muszą być wszystkie pozycje tzn te niezerowe oraz pozostałe z wartością 0 (z pliku wzorcowego)
Może doprecyzuje jak wyglądają teraz pliki:
wzorzec.csv
Lp ; Numer wartości ; Nazwa wartości ; Ilość sztuk
1 ; 100-001 ; wartość1 ; 0
2 ; 100-002 ; wartość2 ; 0
3 ; 201-001 ; wartość3 ; 0
raport.csv
wartość1 ; 5
wartość3 ; 2
Jako wynik ostateczny powinienem otrzymać:
Lp ; Numer wartości ; Nazwa wartości ; Ilość sztuk
1 ; 100-001 ; wartość1 ; 5
2 ; 100-002 ; wartość2 ; 0
3 ; 201-001 ; wartość3 ; 2
Ostatnio edytowany przez moro (2018-03-08 07:07:30)
Offline
Możesz użyć sed'a. Ale szczerze mówiąc to lepiej zastosować inny język, np. python, który ma w standardowym wyposażeniu biblioteki do czytania i pisania CSV i ogólnie jest bardziej sensownym wyborem do takich zadań. Takie tablicę możesz wczytać do słowników i w prosty sposób zaktualizować wartości, a potem wygenerować plik wynikowy.
Offline
a jakby zastosować do tego pętle While
#!/bin/bash
while IFS=; read -r col1 col2
do
reszta=$(grep -w $col3 $col4 wzorzec.csv)
echo "I got:$col1|$col2|$col3|$col4 $reszta"
done < raport.csv
tylko nie chce mi to zadziałać....
Offline
grep obsłuży dwa wzorce ale musisz go o tym poinformować odpowiednią opcją.
Zajrzyj do manuala.
Offline
Narzędzia wybiera się zależnie od celu. Jeślu chcesz wbić gwoździa to używasz młotka. Jeśli chcesz wkręcić wkręta - używasz śrubokręta albo wkrętarki.
Owszem - wkrętarką też gwoździa wbijesz... Ale czy na pewno to do tego służy?
Ty chcesz wkręcić wkręt młotkiem. Pewnie się da... Ale ja bym użył śrubokrętu.
Offline
awkiem bardzo ładnie parsuje się csv, łącznie z tymi eksportowanymi z excela gdzie trafi sie przypadek że między cudzysłowami trafi znak nowej linii, przecinek czy inne cudo :)
Jakbyś napisał coś więcej o tych plikach to pewnie szłoby coś napisać na kolanie :)
bo szczerze mówiąc nie rozumiem po co potrzebujesz dwa pliki wejściowe, jeden z danymi a drugi z licznikiem.
Offline
zakładając pliki csv bez nagłówków i bez niepotrzebnych spacji:
cut -d ';' -f -3 wzorzec.csv | while read line; do wartosc="$(echo "$line" | cut -d ';' -f 3)" ilosc="$(grep -m 1 "^${wartosc};" raport.csv | cut -d ';' -f 2)" [ -z "$ilosc" ] && ilosc=0 echo "${line};${ilosc}" done
Ostatnio edytowany przez seler (2018-03-09 14:28:53)
Offline
Strony: 1