Май 302013
 

likeunix
Решил я упростить девчонкам обрабатывать зарплатные списки, их не так много но все равно.
Так вот для начало нам нужно ( выгрузить ) xls файл в текстовый формат ( csv, txt ), после уже начнем его парсить ( выделять из него нужные данные ).
Первый скрипт делает переименования файлов, убирает из имен файлов пробелы.

#!/bin/sh
XLS=`ls /mnt/share/ZP/*.xls`
SAVEIFS="${IFS}"
IFS='
'
#########################
if [ "${XLS}" != "" ]; then
for f in ${XLS};
do
n=`echo "$f" | sed 's@ @_@g'`
mv -n "$f" "$n"
done
IFS="${SAVEIFS}"
fi
sh /root/pars_xls
exit 0

Второй скрипт уже разбирает файла по кирпичикам, то-есть парсит файл.
В этом скрипту я определил локаль по умолчанию, а иначе файл обрабатывался не корректно.
Для того, что бы выгрузить xls файл в текст я решил воспользоваться портом ( программой ) xls2csv.
При выгрузке в текст мне понадобился параметр -q 0 -этим мы уберем экранирование строк, слов в файле.
После мне нужно было его еще и с конвертировать в кодировку cp866, но подумав я решив, это действия сделать после иначе возникли бы лишние тело движение при выборке нужных данных из файла.
После первого запуска, файл обработался нормально но программа для которой готовилась обработка не захотела принимать, писала странные ошибки при загрузке файла.
Просмотрев структуру тестового файла заметил что не создается windows каретка переноса строки, решил исправить определил для этого переменную CR
Так же я добавил функционал подсчета количество обработанных реестров переменой NUM.
С названием не стал заморачиватся, решил сделать индивидуальное название ( номер реестра — выбирался хаотично с помощью утилиты jot и время обработки его), после я решил отказаться от такого названия, а оставить как есть, только пробелы убрать в названиях файлов и добавил переменную TIME она добавит время обработки.
После выборки, решил воспользоваться утилитой enconv.
Проверка в какой кодировке файл можно так enca /путь/к/файлу.txt
После мы удалим уже обработанные xls файлы.
И последним действием отправим сообщение, что реестр обработан.
Для отправки сообщения я воспользовался smbclient которая в ходит в состав самбы она аналог windows утилиты net send и утилита mail для отправки письма пользователю.
При отправки на почту пользователю, возникли проблемы с кодировкой. Адресат использую вэб морду почтового сервера exchange, почему-то если указать текст отправки на кириллице, то письма приходила в битой кодировке, решил не заморачиватся а на транслите сделать.
Вот в принципе и все, сам скрипт расположен чуть ниже.

#!/bin/sh
# Script processing xls files.
#
#####GLOBAL LOCALE#######
LC_CTYPE=ru_RU.CP1251
export LC_CTYPE
#########################
X=1
NUM=0
DATE=`date +"%Y-%m-%d"`
DES="/mnt/do_obmen/ПАВЛОВСК/ЗП/"
XLS=`ls /mnt/share/ZP/*.xls`
OLD="/mnt/share/Обработанные_списки/"
BIN="/usr/local/bin"
CR=`echo -e "\r"`
SAVEIFS="${IFS}"
IFS='
'
#########################
if [ "${XLS}" != "" ]; then
mkdir -p "$DES/$DATE"
#
for f in ${XLS};
do
n=`echo "$f" | cut -f5 -d / | sed 's/.xls$//'`
TIME=`date +"%H-%M-%S"`
#RAN=`jot -r 1 2 25`
#$BIN/xls2csv -q 0 "$f" | grep -v ",,,," | grep -v ",," | grep -v "Счет в банке" | awk -v p=1 '/,Сумма,Счета/ {p=0} p {print $0} /$0/ {p=1}' | sed 's/\(.*\...\).*/\1/' | uniq -u | sed 's/\ \{1,\},/,/g; s/\([0-9]\{1,\}\),\([0-9]\{1\}\)/\1.\2/' | tr -s "\r" | sed 's/$/'${CR}'/' > "$DES$DATE/$n-$TIME.txt"
# Чуть подправил парсинг, в первом случае парсится первая страница, и изо этого неправильно данные выходили.
$BIN/xls2csv -q 0 "$f" | sed '0,/^L/d; /^,,,,,,,,,,,/q' | grep ",,," | sed '$d;s/,,,,,,,,,,,$//' | sed 's/\(.*\...\).*/\1/' | uniq -u | sed 's/\ \{1,\},/,/g; s/\([0-9]\{1,\}\),\([0-9]\{1\}\)/\1.\2/' | tr -s "\r" | sed 's/$/'${CR}'/' | tr -d '\f' > "$DES$DATE/$n-$TIME.txt"
X=$(($X+1));
let "NUM += 1"
done
#
for s in "$DES$DATE/*.txt";
do
$BIN/enconv $s -x cp866
done
mkdir -p "$OLD/$DATE"
IFS="${SAVEIFS}"
#
echo "Обработано реестров в количестве $NUM штук!" | smbclient -M PAV-005 -N
echo "Obrabotano reestrov v kolichestve $NUM shtuk! ${CR} ${XLS}" | mail -s "Obrabotano reestrov v kolichestve $NUM shtuk!" user@local.mail
mv ${XLS} $OLD$DATE
fi
#
exit 0

 Leave a Reply

(required)

(required)

40 Запросов к базе. 0,365 Генерации страницы, 37MB Использование памяти.
Вы зашли с IP: 54.225.16.10