Как я фильтровал выгрузку MYSQL и перегонял её в csv с промежуточными сохранениями в файл

Однажды поставили мне задачу, выгрузить из базы определенные данные, и предоставить это все в виде Excel таблицы.

Excel у меня не было под рукой, зато вот что было:

1) txt файл вида:

264365 52974 53544 0 e8653f9d04542a20cd9b0d1061e8bf22 5 109.xxx.193.xxx 0
295026 55838 56058 0 4a59329698a8ae863b3174a54ea45606 5 82.xxx.222.xxx 0
295027 55838 55940 9497 af825da01087ba82cdbeb161c77ad10a 1 109.xxx.193.xxx 0

Данные никак не отфильтрованы, это просто тупо выгрузка из таблицы.

2) linux shell

Вот такую команду набросал:

cat 55838.txt | grep '[\t]*56217[\t]*' | sed 's/[0-9]\{6\}\t\([0-9]\{5\}\t[0-9]\{5\}\)\t[0-9]\{1,\}\t[a-zA-Z0-9]*\(\t[0-5]\{1\}\t[0-9\.]\{7,15\}\).*$/\1\2/' | tee '55838.filtered.txt' | awk 'BEGIN {x = 0; print "ИД материала\tИд работы\tОценка пользователя\tIP пользователя"} {x += $3; print $0;} END {print "ИТОГО:\t \t" x "\t "}' | tee '55838.filtered.calculated.txt' | sed 's/\t/;/g' | sed 's/[^;]*/"&"/g' > 55838.csv

А теперь разберем подробнее каждый вызов.

cat 55838.txt — отправляет содержимое файла в стандартный поток вывода
grep ‘[\t]*56217[\t]*’ — фильтрует стандартный ввод, и выводит только строки, содержащие 56217 окруженный символами табуляции
sed ‘s/[0-9]\{6\}\t\([0-9]\{5\}\t[0-9]\{5\}\)\t[0-9]\{1,\}\t[a-zA-Z0-9]*\(\t[0-5]\{1\}\t[0-9\.]\{7,15\}\).*$/\1\2/’ — вырезает ненужные поля из ввода, в данном случае мы делаем так:
Строку вида:
264365 52974 53544 0 e8653f9d04542a20cd9b0d1061e8bf22 5 109.xxx.193.xxx 0
Превращаем в строку:
264365 52974 53544 0 e8653f9d04542a20cd9b0d1061e8bf22 5 109.xxx.193.xxx 0
Т.е: 52974 53544 1 109.xxx.193.xxx

tee ‘55838.filtered.txt’ — сохраняет стандартный ввод в файл, и направляет его в стандартный вывод (1-е промежуточное сохранение)
awk ‘BEGIN {x=0; print «ИД материала\tИд работы\tОценка пользователя\tIP пользователя»} {x += $3; print $0;} END {print «ИТОГО:\t \t» x «\t «}’ — добавляет названия столбцов перед остальным содержимым, и ведет подсчет общей оценки пользователя.
tee ‘55838.filtered.calculated.txt’ — см. выше
sed ‘s/\t/;/g’ — заменяем символы табуляции на точку с запятой
sed ‘/[^;]*/»&»/g’ — обрамляем все «ячейки» двойными кавычками
> 55838.csv — сохраняем обработанный текст в файл

Таким образом мы получили валидный (для OpenOffice) csv файл.

Screenshot from 2015-05-27 11:38:00

Комментарии

comments powered by Disqus
Яндекс.Метрика