Napisałem skrypt, który uruchamia program ładujący sql*loader co minute. Skrypt czyta plik csv ze struktura (yyyy-mm-dd HH:mm:ss;column1;column2;column3). Potrzebuje że ten skrypt czytał tylko dane które pojawiły się w pliku w ostatniej minucie a nie za każdym razem cały plik. Miałem pomysł żeby czytać rekordy które pojawiły się w pliku w ostatniej minucie i zapisać do innego pliki który będzie czytał sql loader. Problem polega na tym że nie mam pojęcia jak wyciągnąć dane z pliku csv z ostatniej minuty
A nie możesz zapisać sobie gdzieś ostatniego nr wiersza i kolejny raz czytać od tego wiersza + 1?
A w jakim języku to piszesz? Najlepiej będzie tak jak to robią binlogi od SQL - czytać od ostatniego numeru wiersza.
To musi być skrypt w bashu
Pokaż już co masz :)
@Piotr17: widzę, że nie śpieszysz się z pokazaniem kodu. Jeśli ma to być w bashu to w mojej opinii powinien to wglądać jakoś tak
#/bin/bash
FILENAME="/pat/to/csv/file.csv"
LAST_READ_LINE_FILE="/temporary/file/to/variable.txt"
if test -f "$LAST_READ_LINE_FILE"; then
echo "File $LAST_READ_LINE_FILE exist"
else
echo "File $LAST_READ_LINE_FILE not exist"
echo "0" > $LAST_READ_LINE_FILE
fi
LAST_READ_LINE=$(cat $LAST_READ_LINE_FILE)
n=1
while read -r line; do
echo $line
if [ "$n" -gt "$LAST_READ_LINE" ]
#DO SOMETHING WITH $line
fi
n=$((n+1))
done < "$FILENAME"
LAST_READ_LINE=$n
echo $LAST_READ_LINE > $LAST_READ_LINE_FILE
Piotr17 napisał(a):
Potrzebuje że ten skrypt czytał tylko dane które pojawiły się w pliku w ostatniej minucie a nie za każdym razem cały plik.
jeśli jakieś źródło napierdziela danymi, to w ogóle ten temat jest źle postawiony. Z wielu powodów:
a) locking na tym pliku. A jeśli nie ma nami lockingu ... to tylko gorzej ...
b) brak czasu, jak mówisz o odstępie 1 minuty
c) objętości, jakie osiąga, i czas w jakim się wczytuje itd ...
d) gdy jest wczytywany/wczytany dane nadal pukają
Może warto przemyśleć dawcę tych danych ?